This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 ad92aec5645 Refactor MCP type checks and local dispatch (#40341)
ad92aec5645 is described below
commit ad92aec5645920b16ad2ca04e99e424c21027c4b
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 22 19:42:31 2026 +0800
Refactor MCP type checks and local dispatch (#40341)
---
.../HttpTransportConfigurationValidator.java | 6 +-
.../transport/MCPTransportErrorFactory.java | 5 +-
.../server/http/SessionAttributionResolver.java | 4 +-
.../YamlHttpTransportConfigurationSwapperTest.java | 21 ++
.../metadata/GovernanceMetadataQueryService.java | 4 +-
.../error/MCPQueryRecoveryPayloadFactory.java | 19 +-
.../protocol/error/MCPRecoveryPayloadSupport.java | 14 +-
.../error/MCPSQLRecoveryPayloadFactory.java | 3 +-
.../metadata/MetadataResourcePayloadMapper.java | 23 +-
.../core/tool/handler/MCPToolArgumentContract.java | 2 +-
.../handler/execute/MCPJdbcStatementExecutor.java | 6 +-
.../MCPJdbcTransactionStatementExecutor.java | 20 +-
.../tool/handler/execute/MCPStatementAnalyzer.java | 34 ++-
.../execute/SQLStatementObjectExtractor.java | 157 +++++++------
.../execute/SQLStatementSafetyValidator.java | 33 ++-
.../tool/handler/execute/SQLStatementScanner.java | 11 +-
.../handler/execute/SQLStatementTreeWalker.java | 244 ++++++++++-----------
.../metadata/SearchMetadataToolService.java | 15 +-
.../core/workflow/WorkflowExecutionService.java | 13 +-
.../tool/model/BroadcastWorkflowRequest.java | 11 +-
.../BroadcastRuleDistSQLPlanningService.java | 6 +-
.../tool/model/BroadcastWorkflowRequestTest.java | 25 +++
.../encrypt/tool/model/EncryptWorkflowRequest.java | 4 +-
.../EncryptWorkflowApplyArtifactValidator.java | 4 +-
.../ReadwriteSplittingRuleWorkflowRequest.java | 11 +-
.../ReadwriteSplittingStatusWorkflowRequest.java | 4 +-
.../ReadwriteSplittingRuleWorkflowRequestTest.java | 25 +++
.../ShadowAlgorithmCleanupWorkflowRequest.java | 4 +-
.../ShadowDefaultAlgorithmWorkflowRequest.java | 5 +-
.../tool/model/ShadowRuleWorkflowRequest.java | 5 +-
.../service/ShadowWorkflowValidationService.java | 6 +-
.../tool/model/ShardingWorkflowRequest.java | 2 +-
.../service/ShardingWorkflowPlanningService.java | 2 +-
.../service/ShardingWorkflowValidationService.java | 19 +-
.../mcp/registry/MCPRegistryMetadataCommand.java | 6 +-
.../database/capability/MCPDatabaseCapability.java | 16 +-
.../exception/MCPJDBCExceptionClassifier.java | 32 +--
.../FirebirdMCPDialectSQLExceptionClassifier.java | 7 +-
.../MySQLMCPDialectSQLExceptionClassifier.java | 12 +-
.../descriptor/MCPToolInputSchemaValidator.java | 2 +-
.../UniqueMCPPromptArgumentNamesValidator.java | 2 +-
.../support/protocol/payload/MCPItemsPayload.java | 4 +-
.../support/resource/MCPUriPathSegmentUtils.java | 15 +-
.../workflow/model/SecretReferenceValue.java | 5 +-
.../workflow/service/WorkflowAlgorithmUtils.java | 4 +-
.../service/WorkflowPlanningArguments.java | 2 +-
.../support/workflow/service/WorkflowSQLUtils.java | 7 +-
.../service/WorkflowSecretReferenceUtils.java | 4 +-
.../workflow/spi/WorkflowRuntimeDefinition.java | 2 +-
49 files changed, 474 insertions(+), 413 deletions(-)
diff --git
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
index 7708c39ea8a..f9915a6ac9f 100644
---
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
+++
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
@@ -121,8 +121,10 @@ public final class HttpTransportConfigurationValidator
implements ConstraintVali
}
private boolean isHttpTokenSymbol(final char value) {
- return '!' == value || '#' == value || '$' == value || '%' == value ||
'&' == value || '\'' == value || '*' == value || '+' == value || '-' == value
|| '.' == value
- || '^' == value || '_' == value || '`' == value || '|' ==
value || '~' == value;
+ return switch (value) {
+ case '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_',
'`', '|', '~' -> true;
+ default -> false;
+ };
}
private void addViolation(final ConstraintValidatorContext context, final
String propertyName, final String message) {
diff --git
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
index 1742803c851..77552076e34 100644
---
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
+++
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
@@ -50,9 +50,8 @@ public final class MCPTransportErrorFactory {
* @return MCP transport error
*/
public static McpError createError(final Throwable cause) {
- if (cause instanceof MCPTransportSecurityException) {
- return createProtocolError(
- new MCPErrorPayload(cause.getMessage(),
createTransportSecurityRecovery((MCPTransportSecurityException) cause)),
getProtocolErrorCode(cause));
+ if (cause instanceof MCPTransportSecurityException ex) {
+ return createProtocolError(new MCPErrorPayload(cause.getMessage(),
createTransportSecurityRecovery(ex)), getProtocolErrorCode(cause));
}
if (!isApplicationError(cause)) {
return createInternalError(cause);
diff --git
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
index 3aa1584470d..13b54a90f57 100644
---
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
+++
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
@@ -31,7 +31,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
/**
* Session attribution resolver.
@@ -99,7 +99,7 @@ public final class SessionAttributionResolver {
return !isEnabled() ? "disabled" : String.format("trusted-header:%s",
config.getSubjectHeader());
}
- private Map<String, String> resolveAttributes(final Iterable<String>
headerNames, final Function<String, String> headerValueReader) {
+ private Map<String, String> resolveAttributes(final Iterable<String>
headerNames, final UnaryOperator<String> headerValueReader) {
Map<String, String> result = new LinkedHashMap<>();
String attributeHeaderPrefix = config.getAttributeHeaderPrefix();
if (attributeHeaderPrefix.isEmpty()) {
diff --git
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
index 216d74ec08c..2115216b290 100644
---
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
+++
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
@@ -22,6 +22,8 @@ import
org.apache.shardingsphere.mcp.bootstrap.config.SessionAttributionSourceCo
import
org.apache.shardingsphere.mcp.bootstrap.config.yaml.config.YamlHttpTransportConfiguration;
import
org.apache.shardingsphere.mcp.bootstrap.config.yaml.config.YamlSessionAttributionSourceConfiguration;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@@ -138,6 +140,25 @@ class YamlHttpTransportConfigurationSwapperTest {
assertThat(actual.getSessionAttributionSource().getAttributeHeaderPrefix(),
is("X-Test-Attr-"));
}
+ @ParameterizedTest(name = "HTTP token symbol {0}")
+ @ValueSource(chars = {'!', '#', '$', '%', '&', '\'', '*', '+', '-', '.',
'^', '_', '`', '|', '~'})
+ void assertSwapToObjectWithSessionAttributionHeaderSymbol(final char
symbol) {
+ String expectedSubjectHeader = "X-Foo" + symbol;
+ YamlHttpTransportConfiguration yamlConfig =
createYamlConfig("127.0.0.1", 18088, "/mcp");
+
yamlConfig.setSessionAttributionSource(createSessionAttributionSource(expectedSubjectHeader,
"X-Test-Source", "X-Test-Attr-"));
+ HttpTransportConfiguration actual = swapper.swapToObject(yamlConfig);
+ assertThat(actual.getSessionAttributionSource().getSubjectHeader(),
is(expectedSubjectHeader));
+ }
+
+ @ParameterizedTest(name = "invalid HTTP header {0}")
+ @ValueSource(strings = {"X-Foo Bar", "X-Foo\tBar", "X-FooéBar",
"X-Foo١Bar"})
+ void assertSwapToObjectWithInvalidSessionAttributionHeaderCharacter(final
String subjectHeader) {
+ YamlHttpTransportConfiguration yamlConfig =
createYamlConfig("127.0.0.1", 18088, "/mcp");
+
yamlConfig.setSessionAttributionSource(createSessionAttributionSource(subjectHeader,
"X-Test-Source", "X-Test-Attr-"));
+ IllegalArgumentException actual =
assertThrows(IllegalArgumentException.class, () ->
swapper.swapToObject(yamlConfig));
+ assertThat(actual.getMessage(), is("MCP HTTP transport configuration
property `sessionAttributionSource.subjectHeader` must be a valid HTTP header
name."));
+ }
+
@Test
void assertSwapToObjectWithInvalidSessionAttributionSubjectHeader() {
YamlHttpTransportConfiguration yamlConfig =
createYamlConfig("127.0.0.1", 18088, "/mcp");
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
index efdfe1c82e5..4707bb86c37 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
@@ -152,8 +152,8 @@ public final class GovernanceMetadataQueryService {
if (value instanceof Collection) {
return redactCollection((Collection<?>) value);
}
- if (value instanceof String) {
- return redactJsonString((String) value);
+ if (value instanceof String text) {
+ return redactJsonString(text);
}
return new RedactedValue(value, false);
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
index 4a7c0487f58..15cb88f1abe 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
@@ -48,9 +48,12 @@ final class MCPQueryRecoveryPayloadFactory {
return true;
}
MCPJDBCErrorCategory category =
MCPJDBCExceptionClassifier.classify(cause);
- return cause instanceof MCPTimeoutException &&
MCPJDBCErrorCategory.TIMEOUT == category
- || cause instanceof MCPUnsupportedException &&
MCPJDBCErrorCategory.FEATURE_NOT_SUPPORTED == category
- || cause instanceof MCPInvalidRequestException &&
MCPJDBCErrorCategory.SYNTAX == category;
+ return switch (cause) {
+ case MCPTimeoutException ignored -> MCPJDBCErrorCategory.TIMEOUT
== category;
+ case MCPUnsupportedException ignored ->
MCPJDBCErrorCategory.FEATURE_NOT_SUPPORTED == category;
+ case MCPInvalidRequestException ignored ->
MCPJDBCErrorCategory.SYNTAX == category;
+ default -> false;
+ };
}
static Map<String, Object> create(final Throwable cause) {
@@ -111,9 +114,13 @@ final class MCPQueryRecoveryPayloadFactory {
}
private static boolean usesResourceHint(final String category) {
- return MCPDiagnosticCategory.OBJECT_NOT_VISIBLE.equals(category) ||
MCPDiagnosticCategory.CONNECTION_INTERRUPTED.equals(category)
- || MCPDiagnosticCategory.EXECUTION_TIMEOUT.equals(category) ||
MCPDiagnosticCategory.UNSUPPORTED_DATABASE_CAPABILITY.equals(category)
- || MCPDiagnosticCategory.QUERY_FAILED.equals(category);
+ switch (category) {
+ case MCPDiagnosticCategory.OBJECT_NOT_VISIBLE,
MCPDiagnosticCategory.CONNECTION_INTERRUPTED,
MCPDiagnosticCategory.EXECUTION_TIMEOUT,
+ MCPDiagnosticCategory.UNSUPPORTED_DATABASE_CAPABILITY,
MCPDiagnosticCategory.QUERY_FAILED:
+ return true;
+ default:
+ return false;
+ }
}
private static List<Map<String, Object>> createResourcesToRead(final
String category) {
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
index 2219d32e720..219f8677510 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
@@ -87,10 +87,14 @@ final class MCPRecoveryPayloadSupport {
}
private static boolean isRuntimeRecoveryCategory(final String category) {
- return
RuntimeDatabaseConnectionException.CATEGORY_MISSING_JDBC_DRIVER.equals(category)
||
RuntimeDatabaseConnectionException.CATEGORY_AUTHENTICATION_FAILED.equals(category)
- ||
RuntimeDatabaseConnectionException.CATEGORY_AUTHORIZATION_FAILED.equals(category)
- ||
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_TIMEOUT.equals(category)
||
RuntimeDatabaseConnectionException.CATEGORY_INVALID_CONFIGURATION.equals(category)
- ||
RuntimeDatabaseConnectionException.CATEGORY_DATABASE_UNAVAILABLE.equals(category)
- ||
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_FAILED.equals(category);
+ switch (category) {
+ case
RuntimeDatabaseConnectionException.CATEGORY_MISSING_JDBC_DRIVER,
RuntimeDatabaseConnectionException.CATEGORY_AUTHENTICATION_FAILED,
+
RuntimeDatabaseConnectionException.CATEGORY_AUTHORIZATION_FAILED,
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_TIMEOUT,
+
RuntimeDatabaseConnectionException.CATEGORY_INVALID_CONFIGURATION,
RuntimeDatabaseConnectionException.CATEGORY_DATABASE_UNAVAILABLE,
+
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_FAILED:
+ return true;
+ default:
+ return false;
+ }
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
index 44440f5e7f3..43fcf78f51e 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
@@ -149,8 +149,7 @@ final class MCPSQLRecoveryPayloadFactory {
"Choose the storage unit from the target
logical database."),
createResourceHint("shardingsphere://databases/{database}/storage-units/{storageUnit}/used-by-rules",
"storage-unit",
"Read rules that use the chosen storage
unit."));
- case "SHOW SINGLE TABLES":
- case "SHOW SINGLE TABLE":
+ case "SHOW SINGLE TABLES", "SHOW SINGLE TABLE":
return
List.of(createResourceHint("shardingsphere://databases/{database}/single-tables",
"single-table",
"Read single table mappings from the target logical
database instead of executing SHOW SINGLE TABLE."));
case "SHOW DEFAULT SINGLE TABLE STORAGE UNIT":
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
index 83572f73b5b..51aa82209a2 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
@@ -59,24 +59,23 @@ public final class MetadataResourcePayloadMapper {
}
private Object mapItem(final ShardingSphereMCPResourceMetadata metadata,
final Object item) {
- if (item instanceof RuntimeDatabaseProfile) {
- return createDatabasePayload((RuntimeDatabaseProfile) item);
+ if (item instanceof RuntimeDatabaseProfile databaseProfile) {
+ return createDatabasePayload(databaseProfile);
}
- if (item instanceof ShardingSphereSchema) {
- return createSchemaPayload(getDatabase(), (ShardingSphereSchema)
item, detail);
+ if (item instanceof ShardingSphereSchema schema) {
+ return createSchemaPayload(getDatabase(), schema, detail);
}
- if (item instanceof ShardingSphereTable) {
- ShardingSphereTable table = (ShardingSphereTable) item;
+ if (item instanceof ShardingSphereTable table) {
return "view".equals(metadata.getObjectScope()) ?
createViewPayload(getDatabase(), getSchema(), table, detail) :
createTablePayload(getDatabase(), getSchema(), table, detail);
}
- if (item instanceof MCPColumnMetadata) {
- return createColumnPayload((MCPColumnMetadata) item);
+ if (item instanceof MCPColumnMetadata columnMetadata) {
+ return createColumnPayload(columnMetadata);
}
- if (item instanceof ShardingSphereIndex) {
- return createIndexPayload((ShardingSphereIndex) item);
+ if (item instanceof ShardingSphereIndex index) {
+ return createIndexPayload(index);
}
- if (item instanceof MCPSequenceMetadata) {
- return createSequencePayload((MCPSequenceMetadata) item);
+ if (item instanceof MCPSequenceMetadata sequenceMetadata) {
+ return createSequencePayload(sequenceMetadata);
}
return item;
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
index 5734db5d2b4..df45ea683b0 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
@@ -180,7 +180,7 @@ final class MCPToolArgumentContract {
}
private BigInteger toBigInteger(final Object value) {
- return value instanceof BigInteger ? (BigInteger) value :
BigInteger.valueOf(((Number) value).longValue());
+ return value instanceof BigInteger bigInteger ? bigInteger :
BigInteger.valueOf(((Number) value).longValue());
}
private int getIntegerSchemaValue(final Map<?, ?> schema, final String
key) {
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
index 948bcc1ab8d..d15361a5a54 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
@@ -236,8 +236,7 @@ public final class MCPJdbcStatementExecutor {
final ClassificationResult
classificationResult) throws SQLException {
boolean hasResultSet =
statement.execute(classificationResult.getNormalizedSql());
switch (classificationResult.getStatementClass()) {
- case QUERY:
- case EXPLAIN:
+ case QUERY, EXPLAIN:
if (!hasResultSet) {
throw new QueryDidNotReturnResultSetException();
}
@@ -247,8 +246,7 @@ public final class MCPJdbcStatementExecutor {
? createResultSetResult(statement.getResultSet(),
executionRequest, classificationResult)
:
SQLExecutionResult.updateCount(classificationResult.getStatementClass(),
classificationResult.getStatementType(), statement.getUpdateCount(),
executionRequest.getMaxRows(),
executionRequest.getTimeoutMs(), classificationResult.getNormalizedSql());
- case DDL:
- case DCL:
+ case DDL, DCL:
return
SQLExecutionResult.statementAck(classificationResult.getStatementClass(),
classificationResult.getStatementType(),
executionRequest.getMaxRows(),
executionRequest.getTimeoutMs(), classificationResult.getNormalizedSql());
default:
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
index e2b9266cab7..6b02aefcc86 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
@@ -74,14 +74,18 @@ public final class MCPJdbcTransactionStatementExecutor {
private void executeSavepointStatement(final String sessionId, final
MCPDatabaseCapability databaseCapability, final ClassificationResult
classificationResult) {
String statementType = classificationResult.getStatementType();
String savepointName =
classificationResult.getSavepointName().orElse("");
- if ("SAVEPOINT".equals(statementType)) {
- executeSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
- } else if ("ROLLBACK TO SAVEPOINT".equals(statementType)) {
- executeRollbackSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
- } else if ("RELEASE SAVEPOINT".equals(statementType)) {
- executeReleaseSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
- } else {
- throw new MCPInvalidRequestException("Statement is not a
transaction command.");
+ switch (statementType) {
+ case "SAVEPOINT":
+ executeSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
+ break;
+ case "ROLLBACK TO SAVEPOINT":
+ executeRollbackSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
+ break;
+ case "RELEASE SAVEPOINT":
+ executeReleaseSavepoint(sessionId, databaseCapability,
getRequiredSavepointName(savepointName));
+ break;
+ default:
+ throw new MCPInvalidRequestException("Statement is not a
transaction command.");
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
index 65b5b6d72fa..a0f3f0744a0 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
@@ -50,6 +50,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
final class MCPStatementAnalyzer {
@@ -57,6 +58,8 @@ final class MCPStatementAnalyzer {
private static final Set<String> DDL_STATEMENT_TYPES = Set.of("CREATE",
"ALTER", "DROP", "TRUNCATE");
+ private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
+
private final Collection<MCPRuleDistSQLStatementClassifier>
ruleDistSQLStatementClassifiers =
ShardingSphereServiceLoader.getServiceInstances(MCPRuleDistSQLStatementClassifier.class);
@@ -122,22 +125,17 @@ final class MCPStatementAnalyzer {
if (ruleDistSQL && DDL_STATEMENT_TYPES.contains(leadingKeyword)) {
return SupportedMCPStatement.DDL;
}
- if (sqlStatement instanceof SelectStatement &&
hasExpectedLeadingKeyword(leadingKeyword, "SELECT")) {
- return SupportedMCPStatement.QUERY;
- }
- if (sqlStatement instanceof InsertStatement &&
hasExpectedLeadingKeyword(leadingKeyword, "INSERT")
- || sqlStatement instanceof UpdateStatement &&
hasExpectedLeadingKeyword(leadingKeyword, "UPDATE")
- || sqlStatement instanceof DeleteStatement &&
hasExpectedLeadingKeyword(leadingKeyword, "DELETE")
- || sqlStatement instanceof MergeStatement &&
hasExpectedLeadingKeyword(leadingKeyword, "MERGE")) {
- return SupportedMCPStatement.DML;
- }
- if (sqlStatement instanceof DDLStatement &&
DDL_STATEMENT_TYPES.contains(leadingKeyword)) {
- return SupportedMCPStatement.DDL;
- }
- if (sqlStatement instanceof GrantStatement &&
"GRANT".equals(leadingKeyword) || sqlStatement instanceof RevokeStatement &&
"REVOKE".equals(leadingKeyword)) {
- return SupportedMCPStatement.DCL;
- }
- throw new MCPUnsupportedSQLStatementException();
+ return switch (sqlStatement) {
+ case SelectStatement ignored when
hasExpectedLeadingKeyword(leadingKeyword, "SELECT") ->
SupportedMCPStatement.QUERY;
+ case InsertStatement ignored when
hasExpectedLeadingKeyword(leadingKeyword, "INSERT") ->
SupportedMCPStatement.DML;
+ case UpdateStatement ignored when
hasExpectedLeadingKeyword(leadingKeyword, "UPDATE") ->
SupportedMCPStatement.DML;
+ case DeleteStatement ignored when
hasExpectedLeadingKeyword(leadingKeyword, "DELETE") ->
SupportedMCPStatement.DML;
+ case MergeStatement ignored when
hasExpectedLeadingKeyword(leadingKeyword, "MERGE") -> SupportedMCPStatement.DML;
+ case DDLStatement ignored when
DDL_STATEMENT_TYPES.contains(leadingKeyword) -> SupportedMCPStatement.DDL;
+ case GrantStatement ignored when "GRANT".equals(leadingKeyword) ->
SupportedMCPStatement.DCL;
+ case RevokeStatement ignored when "REVOKE".equals(leadingKeyword)
-> SupportedMCPStatement.DCL;
+ case null, default -> throw new
MCPUnsupportedSQLStatementException();
+ };
}
private boolean hasExpectedLeadingKeyword(final String leadingKeyword,
final String expectedKeyword) {
@@ -195,11 +193,11 @@ final class MCPStatementAnalyzer {
if (upperSql.startsWith("RELEASE SAVEPOINT")) {
return "RELEASE SAVEPOINT";
}
- return upperSql.split("\\s+")[0];
+ return WHITESPACE_PATTERN.split(upperSql)[0];
}
private String extractSavepointName(final String sql) {
- String[] tokens = sql.split("\\s+");
+ String[] tokens = WHITESPACE_PATTERN.split(sql);
if ("SAVEPOINT".equalsIgnoreCase(tokens[0]) && 2 == tokens.length) {
return tokens[1];
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
index 5ff7ff0539e..e5e3b9696d5 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
@@ -84,10 +84,10 @@ final class SQLStatementObjectExtractor {
private void extractDCLTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
Collection<PrivilegeObjectSegment> privilegeObjects;
- if (sqlStatement instanceof GrantStatement) {
- privilegeObjects = ((GrantStatement)
sqlStatement).getPrivilegeObjects();
- } else if (sqlStatement instanceof RevokeStatement) {
- privilegeObjects = ((RevokeStatement)
sqlStatement).getPrivilegeObjects();
+ if (sqlStatement instanceof GrantStatement grant) {
+ privilegeObjects = grant.getPrivilegeObjects();
+ } else if (sqlStatement instanceof RevokeStatement revoke) {
+ privilegeObjects = revoke.getPrivilegeObjects();
} else {
return;
}
@@ -103,8 +103,7 @@ final class SQLStatementObjectExtractor {
private void extractQualifiedFunctions(final SQLStatement sqlStatement,
final Collection<SQLStatementObjectName> result) {
new SQLStatementTreeWalker(each -> {
}, expression -> {
- if (expression instanceof FunctionSegment) {
- FunctionSegment function = (FunctionSegment) expression;
+ if (expression instanceof FunctionSegment function) {
if (null != function.getOwner()) {
result.add(SQLStatementObjectName.from(Optional.of(function.getOwner()), new
IdentifierValue(function.getFunctionName())));
}
@@ -113,25 +112,23 @@ final class SQLStatementObjectExtractor {
}
private void extractDirectTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof InsertStatement) {
- ((InsertStatement) sqlStatement).getTable().ifPresent(optional ->
addTable(optional, result));
- } else if (sqlStatement instanceof UpdateStatement) {
- addTableSegment(((UpdateStatement) sqlStatement).getTable(),
result);
- } else if (sqlStatement instanceof DeleteStatement) {
- addTableSegment(((DeleteStatement) sqlStatement).getTable(),
result);
- } else if (sqlStatement instanceof MergeStatement) {
- addTableSegment(((MergeStatement) sqlStatement).getTarget(),
result);
- } else if (sqlStatement instanceof CreateTableStatement) {
- CreateTableStatement createTableStatement = (CreateTableStatement)
sqlStatement;
+ if (sqlStatement instanceof InsertStatement insert) {
+ insert.getTable().ifPresent(optional -> addTable(optional,
result));
+ } else if (sqlStatement instanceof UpdateStatement update) {
+ addTableSegment(update.getTable(), result);
+ } else if (sqlStatement instanceof DeleteStatement delete) {
+ addTableSegment(delete.getTable(), result);
+ } else if (sqlStatement instanceof MergeStatement merge) {
+ addTableSegment(merge.getTarget(), result);
+ } else if (sqlStatement instanceof CreateTableStatement
createTableStatement) {
addTable(createTableStatement.getTable(), result);
createTableStatement.getLikeTable().ifPresent(table ->
addTable(table, result));
createTableStatement.getSelectStatement().ifPresent(select ->
addSelectTables(select, result));
- } else if (sqlStatement instanceof AlterTableStatement) {
- addTable(((AlterTableStatement) sqlStatement).getTable(), result);
- } else if (sqlStatement instanceof CreateViewStatement) {
- addTable(((CreateViewStatement) sqlStatement).getView(), result);
- } else if (sqlStatement instanceof AlterViewStatement) {
- AlterViewStatement alterViewStatement = (AlterViewStatement)
sqlStatement;
+ } else if (sqlStatement instanceof AlterTableStatement
alterTableStatement) {
+ addTable(alterTableStatement.getTable(), result);
+ } else if (sqlStatement instanceof CreateViewStatement
createViewStatement) {
+ addTable(createViewStatement.getView(), result);
+ } else if (sqlStatement instanceof AlterViewStatement
alterViewStatement) {
addTable(alterViewStatement.getView(), result);
alterViewStatement.getRenameView().ifPresent(view ->
addTable(view, result));
alterViewStatement.getSelect().ifPresent(select ->
addSelectTables(select, result));
@@ -143,53 +140,53 @@ final class SQLStatementObjectExtractor {
}
private void extractIndexTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof CreateIndexStatement) {
- addIndex(((CreateIndexStatement) sqlStatement).getIndex(), result);
- } else if (sqlStatement instanceof AlterIndexStatement) {
- ((AlterIndexStatement) sqlStatement).getIndex().ifPresent(index ->
addIndex(index, result));
- ((AlterIndexStatement)
sqlStatement).getRenameIndex().ifPresent(index -> addIndex(index, result));
- } else if (sqlStatement instanceof DropIndexStatement) {
- for (IndexSegment each : ((DropIndexStatement)
sqlStatement).getIndexes()) {
+ if (sqlStatement instanceof CreateIndexStatement createIndexStatement)
{
+ addIndex(createIndexStatement.getIndex(), result);
+ } else if (sqlStatement instanceof AlterIndexStatement
alterIndexStatement) {
+ alterIndexStatement.getIndex().ifPresent(index -> addIndex(index,
result));
+ alterIndexStatement.getRenameIndex().ifPresent(index ->
addIndex(index, result));
+ } else if (sqlStatement instanceof DropIndexStatement
dropIndexStatement) {
+ for (IndexSegment each : dropIndexStatement.getIndexes()) {
addIndex(each, result);
}
}
}
private void extractDatabaseTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof CreateDatabaseStatement) {
- addNamespaceName(((CreateDatabaseStatement)
sqlStatement).getDatabaseName(), result);
- } else if (sqlStatement instanceof AlterDatabaseStatement) {
- addNamespaceName(((AlterDatabaseStatement)
sqlStatement).getDatabaseName(), result);
- ((AlterDatabaseStatement)
sqlStatement).getRenameDatabaseName().ifPresent(name -> addNamespaceName(name,
result));
- } else if (sqlStatement instanceof DropDatabaseStatement) {
- addNamespaceName(((DropDatabaseStatement)
sqlStatement).getDatabaseName(), result);
+ if (sqlStatement instanceof CreateDatabaseStatement
createDatabaseStatement) {
+ addNamespaceName(createDatabaseStatement.getDatabaseName(),
result);
+ } else if (sqlStatement instanceof AlterDatabaseStatement
alterDatabaseStatement) {
+ addNamespaceName(alterDatabaseStatement.getDatabaseName(), result);
+ alterDatabaseStatement.getRenameDatabaseName().ifPresent(name ->
addNamespaceName(name, result));
+ } else if (sqlStatement instanceof DropDatabaseStatement
dropDatabaseStatement) {
+ addNamespaceName(dropDatabaseStatement.getDatabaseName(), result);
}
}
private void extractSchemaTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof CreateSchemaStatement) {
- ((CreateSchemaStatement)
sqlStatement).getSchemaName().ifPresent(schema ->
addNamespaceIdentifier(schema, result));
- } else if (sqlStatement instanceof AlterSchemaStatement) {
- addNamespaceIdentifier(((AlterSchemaStatement)
sqlStatement).getSchemaName(), result);
- ((AlterSchemaStatement)
sqlStatement).getRenameSchema().ifPresent(schema ->
addNamespaceIdentifier(schema, result));
- } else if (sqlStatement instanceof DropSchemaStatement) {
- for (IdentifierValue each : ((DropSchemaStatement)
sqlStatement).getSchemaNames()) {
+ if (sqlStatement instanceof CreateSchemaStatement
createSchemaStatement) {
+ createSchemaStatement.getSchemaName().ifPresent(schema ->
addNamespaceIdentifier(schema, result));
+ } else if (sqlStatement instanceof AlterSchemaStatement
alterSchemaStatement) {
+ addNamespaceIdentifier(alterSchemaStatement.getSchemaName(),
result);
+ alterSchemaStatement.getRenameSchema().ifPresent(schema ->
addNamespaceIdentifier(schema, result));
+ } else if (sqlStatement instanceof DropSchemaStatement
dropSchemaStatement) {
+ for (IdentifierValue each : dropSchemaStatement.getSchemaNames()) {
addNamespaceIdentifier(each, result);
}
}
}
private void extractSequenceTargets(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof CreateSequenceStatement) {
- addName(((CreateSequenceStatement)
sqlStatement).getSequenceName(), result);
- } else if (sqlStatement instanceof AlterSequenceStatement) {
- addName(((AlterSequenceStatement) sqlStatement).getSequenceName(),
result);
- } else if (sqlStatement instanceof DropSequenceStatement) {
- for (Object each : ((DropSequenceStatement)
sqlStatement).getSequenceNames()) {
- if (each instanceof String) {
- addName((String) each, result);
- } else if (each instanceof SimpleTableSegment) {
- addTable((SimpleTableSegment) each, result);
+ if (sqlStatement instanceof CreateSequenceStatement
createSequenceStatement) {
+ addName(createSequenceStatement.getSequenceName(), result);
+ } else if (sqlStatement instanceof AlterSequenceStatement
alterSequenceStatement) {
+ addName(alterSequenceStatement.getSequenceName(), result);
+ } else if (sqlStatement instanceof DropSequenceStatement
dropSequenceStatement) {
+ for (Object each : dropSequenceStatement.getSequenceNames()) {
+ if (each instanceof String sequenceName) {
+ addName(sequenceName, result);
+ } else if (each instanceof SimpleTableSegment simpleTable) {
+ addTable(simpleTable, result);
} else {
throw new MCPUnsupportedSQLStatementException();
}
@@ -198,8 +195,8 @@ final class SQLStatementObjectExtractor {
}
private void extractMergeTables(final SQLStatement sqlStatement, final
Collection<SQLStatementObjectName> result) {
- if (sqlStatement instanceof MergeStatement) {
- addTableSegment(((MergeStatement) sqlStatement).getSource(),
result);
+ if (sqlStatement instanceof MergeStatement merge) {
+ addTableSegment(merge.getSource(), result);
}
}
@@ -232,44 +229,44 @@ final class SQLStatementObjectExtractor {
collectCommonTableExpressionAliases(each.getSubquery().getSelect(), result);
}
});
- if (sqlStatement instanceof CreateTableStatement) {
- ((CreateTableStatement)
sqlStatement).getSelectStatement().ifPresent(each ->
collectCommonTableExpressionAliases(each, result));
- } else if (sqlStatement instanceof CreateViewStatement) {
- collectCommonTableExpressionAliases(((CreateViewStatement)
sqlStatement).getSelect(), result);
- } else if (sqlStatement instanceof AlterViewStatement) {
- ((AlterViewStatement) sqlStatement).getSelect().ifPresent(each ->
collectCommonTableExpressionAliases(each, result));
+ if (sqlStatement instanceof CreateTableStatement createTableStatement)
{
+ createTableStatement.getSelectStatement().ifPresent(each ->
collectCommonTableExpressionAliases(each, result));
+ } else if (sqlStatement instanceof CreateViewStatement
createViewStatement) {
+
collectCommonTableExpressionAliases(createViewStatement.getSelect(), result);
+ } else if (sqlStatement instanceof AlterViewStatement
alterViewStatement) {
+ alterViewStatement.getSelect().ifPresent(each ->
collectCommonTableExpressionAliases(each, result));
}
}
private Optional<WithSegment> findWithSegment(final SQLStatement
sqlStatement) {
- if (sqlStatement instanceof SelectStatement) {
- return ((SelectStatement) sqlStatement).getWith();
+ if (sqlStatement instanceof SelectStatement select) {
+ return select.getWith();
}
- if (sqlStatement instanceof InsertStatement) {
- return ((InsertStatement) sqlStatement).getWith();
+ if (sqlStatement instanceof InsertStatement insert) {
+ return insert.getWith();
}
- if (sqlStatement instanceof UpdateStatement) {
- return ((UpdateStatement) sqlStatement).getWith();
+ if (sqlStatement instanceof UpdateStatement update) {
+ return update.getWith();
}
- if (sqlStatement instanceof DeleteStatement) {
- return ((DeleteStatement) sqlStatement).getWith();
+ if (sqlStatement instanceof DeleteStatement delete) {
+ return delete.getWith();
}
- return sqlStatement instanceof MergeStatement ? ((MergeStatement)
sqlStatement).getWith() : Optional.empty();
+ return sqlStatement instanceof MergeStatement merge ? merge.getWith()
: Optional.empty();
}
private void addTableSegment(final TableSegment tableSegment, final
Collection<SQLStatementObjectName> result) {
- if (tableSegment instanceof SimpleTableSegment) {
- addTable((SimpleTableSegment) tableSegment, result);
- } else if (tableSegment instanceof JoinTableSegment) {
- addTableSegment(((JoinTableSegment) tableSegment).getLeft(),
result);
- addTableSegment(((JoinTableSegment) tableSegment).getRight(),
result);
- } else if (tableSegment instanceof SubqueryTableSegment) {
+ if (tableSegment instanceof SimpleTableSegment simpleTable) {
+ addTable(simpleTable, result);
+ } else if (tableSegment instanceof JoinTableSegment joinTable) {
+ addTableSegment(joinTable.getLeft(), result);
+ addTableSegment(joinTable.getRight(), result);
+ } else if (tableSegment instanceof SubqueryTableSegment subqueryTable)
{
TableExtractor extractor = new TableExtractor();
- extractor.extractTablesFromSelect(((SubqueryTableSegment)
tableSegment).getSubquery().getSelect());
+
extractor.extractTablesFromSelect(subqueryTable.getSubquery().getSelect());
addTableSegments(extractor.getTableContext(), result);
- } else if (tableSegment instanceof DeleteMultiTableSegment) {
- addTables(((DeleteMultiTableSegment)
tableSegment).getActualDeleteTables(), result);
- addTableSegment(((DeleteMultiTableSegment)
tableSegment).getRelationTable(), result);
+ } else if (tableSegment instanceof DeleteMultiTableSegment
deleteMultiTable) {
+ addTables(deleteMultiTable.getActualDeleteTables(), result);
+ addTableSegment(deleteMultiTable.getRelationTable(), result);
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
index 91b9aca29e5..8cf41560156 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
@@ -37,9 +37,12 @@ import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.Se
import java.util.List;
import java.util.Locale;
+import java.util.regex.Pattern;
final class SQLStatementSafetyValidator {
+ private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
+
private static final List<String> SIDE_EFFECTING_FUNCTION_NAMES =
List.of("NEXTVAL", "NEXT VALUE FOR", "SETVAL", "GET_LOCK", "RELEASE_LOCK",
"RELEASE_ALL_LOCKS",
"PG_ADVISORY_LOCK", "PG_ADVISORY_XACT_LOCK",
"PG_TRY_ADVISORY_LOCK", "PG_TRY_ADVISORY_XACT_LOCK", "PG_ADVISORY_UNLOCK",
"PG_ADVISORY_UNLOCK_ALL",
"SET_CONFIG", "PG_REPLICATION_SLOT_ADVANCE",
"PG_LOGICAL_SLOT_GET_CHANGES", "PG_LOGICAL_SLOT_GET_BINARY_CHANGES",
"PG_LOGICAL_EMIT_MESSAGE", "PG_SWITCH_WAL",
@@ -63,9 +66,17 @@ final class SQLStatementSafetyValidator {
}
private boolean isBannedStatementType(final SQLStatement sqlStatement) {
- return sqlStatement instanceof SetStatement || sqlStatement instanceof
CallStatement
- || sqlStatement instanceof CreateUserStatement || sqlStatement
instanceof AlterUserStatement || sqlStatement instanceof DropUserStatement
- || sqlStatement instanceof CreateRoleStatement || sqlStatement
instanceof AlterRoleStatement || sqlStatement instanceof DropRoleStatement;
+ return switch (sqlStatement) {
+ case SetStatement ignored -> true;
+ case CallStatement ignored -> true;
+ case CreateUserStatement ignored -> true;
+ case AlterUserStatement ignored -> true;
+ case DropUserStatement ignored -> true;
+ case CreateRoleStatement ignored -> true;
+ case AlterRoleStatement ignored -> true;
+ case DropRoleStatement ignored -> true;
+ case null, default -> false;
+ };
}
private boolean containsExecutableComment(final SQLStatement sqlStatement)
{
@@ -82,8 +93,7 @@ final class SQLStatementSafetyValidator {
if (isBannedStatementType(sqlStatement) ||
containsExecutableComment(sqlStatement)) {
throw new MCPBannedSQLStatementException();
}
- if (sqlStatement instanceof SelectStatement) {
- SelectStatement select = (SelectStatement) sqlStatement;
+ if (sqlStatement instanceof SelectStatement select) {
if (select.getInto().isPresent() ||
select.getOutfile().isPresent()) {
throw new MCPBannedSQLStatementException();
}
@@ -94,12 +104,11 @@ final class SQLStatementSafetyValidator {
}
private void checkExpression(final ExpressionSegment expression) {
- if (expression instanceof FunctionSegment) {
- checkFunction((FunctionSegment) expression);
- } else if (expression instanceof BinaryOperationExpression &&
":=".equals(((BinaryOperationExpression) expression).getOperator())) {
+ if (expression instanceof FunctionSegment function) {
+ checkFunction(function);
+ } else if (expression instanceof BinaryOperationExpression binary &&
":=".equals(binary.getOperator())) {
throw new MCPBannedSQLStatementException();
- } else if (expression instanceof ColumnSegment) {
- ColumnSegment column = (ColumnSegment) expression;
+ } else if (expression instanceof ColumnSegment column) {
if (column.getOwner().isPresent() &&
"NEXTVAL".equalsIgnoreCase(column.getIdentifier().getValue())) {
throw new MCPBannedSQLStatementException();
}
@@ -120,7 +129,7 @@ final class SQLStatementSafetyValidator {
}
private boolean isAlterSystemStatement(final String upperSql) {
- String[] words = upperSql.split("\\s+", 3);
+ String[] words = WHITESPACE_PATTERN.split(upperSql, 3);
return 2 <= words.length && "ALTER".equals(words[0]) &&
"SYSTEM".equals(words[1]);
}
@@ -140,6 +149,6 @@ final class SQLStatementSafetyValidator {
if (upperSql.startsWith("SHOW SINGLE TABLE")) {
return "SHOW SINGLE TABLE";
}
- return upperSql.split("\\s+")[0];
+ return WHITESPACE_PATTERN.split(upperSql)[0];
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
index 04779b4efaa..d5ae7fc98b3 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
@@ -205,7 +205,11 @@ final class SQLStatementScanner {
}
char firstChar = text.charAt(0);
char lastChar = text.charAt(text.length() - 1);
- return '"' == firstChar && '"' == lastChar || '`' == firstChar && '`'
== lastChar || '[' == firstChar && ']' == lastChar;
+ return switch (firstChar) {
+ case '"', '`' -> firstChar == lastChar;
+ case '[' -> ']' == lastChar;
+ default -> false;
+ };
}
private boolean containsExecutableCommentMarker(final String text) {
@@ -316,8 +320,11 @@ final class SQLStatementScanner {
}
private int findLineCommentEnd(final String sql, final List<Token> tokens,
final int startIndex, final boolean lineCommentsHandledByLexer) {
+ if (lineCommentsHandledByLexer) {
+ return -1;
+ }
Token start = tokens.get(startIndex);
- if (lineCommentsHandledByLexer || !"-".equals(start.getText()) ||
startIndex + 1 >= tokens.size() || !"-".equals(tokens.get(startIndex +
1).getText())
+ if (!"-".equals(start.getText()) || startIndex + 1 >= tokens.size() ||
!"-".equals(tokens.get(startIndex + 1).getText())
|| tokens.get(startIndex + 1).getStartIndex() !=
start.getStopIndex() + 1) {
return -1;
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
index 9bbd71c03ff..1f63ac9622e 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
@@ -110,36 +110,36 @@ final class SQLStatementTreeWalker {
return;
}
statementConsumer.accept(sqlStatement);
- if (sqlStatement instanceof SelectStatement) {
- walkSelect((SelectStatement) sqlStatement);
- } else if (sqlStatement instanceof InsertStatement) {
- walkInsert((InsertStatement) sqlStatement);
- } else if (sqlStatement instanceof UpdateStatement) {
- walkUpdate((UpdateStatement) sqlStatement);
- } else if (sqlStatement instanceof DeleteStatement) {
- walkDelete((DeleteStatement) sqlStatement);
- } else if (sqlStatement instanceof MergeStatement) {
- walkMerge((MergeStatement) sqlStatement);
+ if (sqlStatement instanceof SelectStatement select) {
+ walkSelect(select);
+ } else if (sqlStatement instanceof InsertStatement insert) {
+ walkInsert(insert);
+ } else if (sqlStatement instanceof UpdateStatement update) {
+ walkUpdate(update);
+ } else if (sqlStatement instanceof DeleteStatement delete) {
+ walkDelete(delete);
+ } else if (sqlStatement instanceof MergeStatement merge) {
+ walkMerge(merge);
} else {
walkDDL(sqlStatement);
}
}
private void walkDDL(final SQLStatement sqlStatement) {
- if (sqlStatement instanceof CreateTableStatement) {
- ((CreateTableStatement)
sqlStatement).getSelectStatement().ifPresent(this::walk);
- } else if (sqlStatement instanceof CreateViewStatement) {
- walk(((CreateViewStatement) sqlStatement).getSelect());
- } else if (sqlStatement instanceof AlterViewStatement) {
- ((AlterViewStatement)
sqlStatement).getSelect().ifPresent(this::walk);
- } else if (sqlStatement instanceof CreateMaterializedViewStatement) {
- walk(((CreateMaterializedViewStatement) sqlStatement).getSelect());
- } else if (sqlStatement instanceof CreateFunctionStatement) {
- walkRoutine(((CreateFunctionStatement)
sqlStatement).getSqlStatements(), ((CreateFunctionStatement)
sqlStatement).getDynamicSqlStatementExpressions());
- } else if (sqlStatement instanceof CreateProcedureStatement) {
- walkRoutine(((CreateProcedureStatement)
sqlStatement).getSqlStatements(), ((CreateProcedureStatement)
sqlStatement).getDynamicSqlStatementExpressions());
- } else if (sqlStatement instanceof CreateTriggerStatement) {
- walkRoutine(((CreateTriggerStatement)
sqlStatement).getSqlStatements(), ((CreateTriggerStatement)
sqlStatement).getDynamicSqlStatementExpressions());
+ if (sqlStatement instanceof CreateTableStatement createTableStatement)
{
+ createTableStatement.getSelectStatement().ifPresent(this::walk);
+ } else if (sqlStatement instanceof CreateViewStatement
createViewStatement) {
+ walk(createViewStatement.getSelect());
+ } else if (sqlStatement instanceof AlterViewStatement
alterViewStatement) {
+ alterViewStatement.getSelect().ifPresent(this::walk);
+ } else if (sqlStatement instanceof CreateMaterializedViewStatement
createMaterializedViewStatement) {
+ walk(createMaterializedViewStatement.getSelect());
+ } else if (sqlStatement instanceof CreateFunctionStatement
createFunctionStatement) {
+ walkRoutine(createFunctionStatement.getSqlStatements(),
createFunctionStatement.getDynamicSqlStatementExpressions());
+ } else if (sqlStatement instanceof CreateProcedureStatement
createProcedureStatement) {
+ walkRoutine(createProcedureStatement.getSqlStatements(),
createProcedureStatement.getDynamicSqlStatementExpressions());
+ } else if (sqlStatement instanceof CreateTriggerStatement
createTriggerStatement) {
+ walkRoutine(createTriggerStatement.getSqlStatements(),
createTriggerStatement.getDynamicSqlStatementExpressions());
}
}
@@ -251,25 +251,25 @@ final class SQLStatementTreeWalker {
return;
}
for (ProjectionSegment each : projections.getProjections()) {
- if (each instanceof ExpressionProjectionSegment) {
- walkExpression(((ExpressionProjectionSegment) each).getExpr());
- } else if (each instanceof ExpressionSegment) {
- walkExpression((ExpressionSegment) each);
- } else if (each instanceof ColumnProjectionSegment) {
- walkExpression(((ColumnProjectionSegment) each).getColumn());
- } else if (each instanceof SubqueryProjectionSegment) {
- walk(((SubqueryProjectionSegment)
each).getSubquery().getSelect());
- } else if (each instanceof DatetimeProjectionSegment) {
- walkExpression(((DatetimeProjectionSegment) each).getLeft());
- walkExpression(((DatetimeProjectionSegment) each).getRight());
+ if (each instanceof ExpressionProjectionSegment
expressionProjection) {
+ walkExpression(expressionProjection.getExpr());
+ } else if (each instanceof ExpressionSegment expression) {
+ walkExpression(expression);
+ } else if (each instanceof ColumnProjectionSegment
columnProjection) {
+ walkExpression(columnProjection.getColumn());
+ } else if (each instanceof SubqueryProjectionSegment
subqueryProjection) {
+ walk(subqueryProjection.getSubquery().getSelect());
+ } else if (each instanceof DatetimeProjectionSegment
datetimeProjection) {
+ walkExpression(datetimeProjection.getLeft());
+ walkExpression(datetimeProjection.getRight());
}
}
}
private void walkOrderByItems(final Iterable<OrderByItemSegment> items) {
for (OrderByItemSegment each : items) {
- if (each instanceof ExpressionOrderByItemSegment) {
- walkExpression(((ExpressionOrderByItemSegment)
each).getExpr());
+ if (each instanceof ExpressionOrderByItemSegment
expressionOrderByItem) {
+ walkExpression(expressionOrderByItem.getExpr());
}
}
}
@@ -280,8 +280,8 @@ final class SQLStatementTreeWalker {
}
private void walkPaginationValue(final PaginationValueSegment value) {
- if (value instanceof ExpressionPaginationValueSegment) {
- walkExpression(((ExpressionPaginationValueSegment)
value).getExpression());
+ if (value instanceof ExpressionPaginationValueSegment
expressionPaginationValue) {
+ walkExpression(expressionPaginationValue.getExpression());
}
}
@@ -314,23 +314,22 @@ final class SQLStatementTreeWalker {
}
private void walkTable(final TableSegment table) {
- if (table instanceof SimpleTableSegment) {
- ((SimpleTableSegment)
table).getTableSampleExpression().ifPresent(this::walkExpression);
- } else if (table instanceof FunctionTableSegment) {
- walkExpression(((FunctionTableSegment) table).getTableFunction());
- } else if (table instanceof JoinTableSegment) {
- JoinTableSegment join = (JoinTableSegment) table;
+ if (table instanceof SimpleTableSegment simpleTable) {
+
simpleTable.getTableSampleExpression().ifPresent(this::walkExpression);
+ } else if (table instanceof FunctionTableSegment functionTable) {
+ walkExpression(functionTable.getTableFunction());
+ } else if (table instanceof JoinTableSegment join) {
walkTable(join.getLeft());
walkTable(join.getRight());
walkExpression(join.getCondition());
join.getLeftQueryPartitionListSegments().forEach(this::walkExpression);
join.getRightQueryPartitionListSegments().forEach(this::walkExpression);
- } else if (table instanceof SubqueryTableSegment) {
- walk(((SubqueryTableSegment) table).getSubquery().getSelect());
- } else if (table instanceof CollectionTableSegment) {
- walkExpression(((CollectionTableSegment)
table).getExpressionSegment());
- } else if (table instanceof DeleteMultiTableSegment) {
- walkTable(((DeleteMultiTableSegment) table).getRelationTable());
+ } else if (table instanceof SubqueryTableSegment subqueryTable) {
+ walk(subqueryTable.getSubquery().getSelect());
+ } else if (table instanceof CollectionTableSegment collectionTable) {
+ walkExpression(collectionTable.getExpressionSegment());
+ } else if (table instanceof DeleteMultiTableSegment deleteMultiTable) {
+ walkTable(deleteMultiTable.getRelationTable());
}
}
@@ -339,70 +338,56 @@ final class SQLStatementTreeWalker {
return;
}
expressionConsumer.accept(expression);
- if (expression instanceof FunctionSegment) {
- walkFunction((FunctionSegment) expression);
- } else if (expression instanceof CommonExpressionSegment) {
- ((CommonExpressionSegment)
expression).getChildren().forEach(this::walkExpression);
- } else if (expression instanceof AggregationProjectionSegment) {
- AggregationProjectionSegment aggregation =
(AggregationProjectionSegment) expression;
- aggregation.getParameters().forEach(this::walkExpression);
- aggregation.getWindow().ifPresent(this::walkWindow);
- } else if (expression instanceof BinaryOperationExpression) {
- walkExpression(((BinaryOperationExpression) expression).getLeft());
- walkExpression(((BinaryOperationExpression)
expression).getRight());
- } else if (expression instanceof ColumnAssignmentSegment) {
- walkExpression(((ColumnAssignmentSegment) expression).getValue());
- } else if (expression instanceof ListExpression) {
- ((ListExpression)
expression).getItems().forEach(this::walkExpression);
- } else if (expression instanceof BetweenExpression) {
- BetweenExpression between = (BetweenExpression) expression;
- walkExpression(between.getLeft());
- walkExpression(between.getBetweenExpr());
- walkExpression(between.getAndExpr());
- } else if (expression instanceof InExpression) {
- walkExpression(((InExpression) expression).getLeft());
- walkExpression(((InExpression) expression).getRight());
- } else if (expression instanceof CaseWhenExpression) {
- walkCaseWhen((CaseWhenExpression) expression);
- } else if (expression instanceof NotExpression) {
- walkExpression(((NotExpression) expression).getExpression());
- } else if (expression instanceof TypeCastExpression) {
- walkExpression(((TypeCastExpression) expression).getExpression());
- } else if (expression instanceof CollateExpression) {
- ((CollateExpression)
expression).getExpr().ifPresent(this::walkExpression);
- } else if (expression instanceof DatetimeExpression) {
- walkExpression(((DatetimeExpression) expression).getLeft());
- walkExpression(((DatetimeExpression) expression).getRight());
- } else if (expression instanceof IntervalExpression) {
- walkExpression(((IntervalExpression) expression).getValue());
- } else if (expression instanceof IntervalExpressionProjection) {
- walkIntervalProjection((IntervalExpressionProjection) expression);
- } else if (expression instanceof KeyValueSegment) {
- walkExpression(((KeyValueSegment) expression).getKey());
- walkExpression(((KeyValueSegment) expression).getValue());
- } else if (expression instanceof RowExpression) {
- ((RowExpression)
expression).getItems().forEach(this::walkExpression);
- } else if (expression instanceof UnaryOperationExpression) {
- walkExpression(((UnaryOperationExpression)
expression).getExpression());
- } else if (expression instanceof ValuesExpression) {
- ((ValuesExpression)
expression).getRowConstructorList().forEach(each ->
each.getValues().forEach(this::walkExpression));
- } else if (expression instanceof MatchAgainstExpression) {
- walkMatchAgainst((MatchAgainstExpression) expression);
- } else if (expression instanceof MultisetExpression) {
- walkExpression(((MultisetExpression) expression).getLeft());
- walkExpression(((MultisetExpression) expression).getRight());
- } else if (expression instanceof OuterJoinExpression) {
- walkExpression(((OuterJoinExpression) expression).getColumnName());
- } else if (expression instanceof SubquerySegment) {
- walk(((SubquerySegment) expression).getSelect());
- } else if (expression instanceof SubqueryExpressionSegment) {
- walk(((SubqueryExpressionSegment)
expression).getSubquery().getSelect());
- } else if (expression instanceof ExistsSubqueryExpression) {
- walk(((ExistsSubqueryExpression)
expression).getSubquery().getSelect());
- } else if (expression instanceof QuantifySubqueryExpression) {
- walk(((QuantifySubqueryExpression)
expression).getSubquery().getSelect());
- } else {
- walkXMLExpression(expression);
+ switch (expression) {
+ case FunctionSegment function -> walkFunction(function);
+ case CommonExpressionSegment common ->
common.getChildren().forEach(this::walkExpression);
+ case AggregationProjectionSegment aggregation -> {
+ aggregation.getParameters().forEach(this::walkExpression);
+ aggregation.getWindow().ifPresent(this::walkWindow);
+ }
+ case BinaryOperationExpression binary -> {
+ walkExpression(binary.getLeft());
+ walkExpression(binary.getRight());
+ }
+ case ColumnAssignmentSegment assignment ->
walkExpression(assignment.getValue());
+ case ListExpression list ->
list.getItems().forEach(this::walkExpression);
+ case BetweenExpression between -> {
+ walkExpression(between.getLeft());
+ walkExpression(between.getBetweenExpr());
+ walkExpression(between.getAndExpr());
+ }
+ case InExpression in -> {
+ walkExpression(in.getLeft());
+ walkExpression(in.getRight());
+ }
+ case CaseWhenExpression caseWhen -> walkCaseWhen(caseWhen);
+ case NotExpression not -> walkExpression(not.getExpression());
+ case TypeCastExpression typeCast ->
walkExpression(typeCast.getExpression());
+ case CollateExpression collate ->
collate.getExpr().ifPresent(this::walkExpression);
+ case DatetimeExpression datetime -> {
+ walkExpression(datetime.getLeft());
+ walkExpression(datetime.getRight());
+ }
+ case IntervalExpression interval ->
walkExpression(interval.getValue());
+ case IntervalExpressionProjection intervalProjection ->
walkIntervalProjection(intervalProjection);
+ case KeyValueSegment keyValue -> {
+ walkExpression(keyValue.getKey());
+ walkExpression(keyValue.getValue());
+ }
+ case RowExpression row ->
row.getItems().forEach(this::walkExpression);
+ case UnaryOperationExpression unary ->
walkExpression(unary.getExpression());
+ case ValuesExpression values ->
values.getRowConstructorList().forEach(each ->
each.getValues().forEach(this::walkExpression));
+ case MatchAgainstExpression match -> walkMatchAgainst(match);
+ case MultisetExpression multiset -> {
+ walkExpression(multiset.getLeft());
+ walkExpression(multiset.getRight());
+ }
+ case OuterJoinExpression outerJoin ->
walkExpression(outerJoin.getColumnName());
+ case SubquerySegment subquery -> walk(subquery.getSelect());
+ case SubqueryExpressionSegment subqueryExpression ->
walk(subqueryExpression.getSubquery().getSelect());
+ case ExistsSubqueryExpression exists ->
walk(exists.getSubquery().getSelect());
+ case QuantifySubqueryExpression quantify ->
walk(quantify.getSubquery().getSelect());
+ default -> walkXMLExpression(expression);
}
}
@@ -430,23 +415,22 @@ final class SQLStatementTreeWalker {
}
private void walkXMLExpression(final ExpressionSegment expression) {
- if (expression instanceof XmlElementFunctionSegment) {
- XmlElementFunctionSegment xmlElement = (XmlElementFunctionSegment)
expression;
+ if (expression instanceof XmlElementFunctionSegment xmlElement) {
xmlElement.getXmlAttributes().forEach(this::walkExpression);
xmlElement.getParameters().forEach(this::walkExpression);
- } else if (expression instanceof XmlPiFunctionSegment) {
- walkExpression(((XmlPiFunctionSegment)
expression).getEvalNameValueExpr());
- walkExpression(((XmlPiFunctionSegment) expression).getValueExpr());
- } else if (expression instanceof XmlQueryAndExistsFunctionSegment) {
- ((XmlQueryAndExistsFunctionSegment)
expression).getParameters().forEach(this::walkExpression);
- } else if (expression instanceof XmlSerializeFunctionSegment) {
- walkExpression(((XmlSerializeFunctionSegment)
expression).getParameter());
- } else if (expression instanceof XmlTableFunctionSegment) {
- walkXmlTableOptions(((XmlTableFunctionSegment)
expression).getXmlTableOption());
- } else if (expression instanceof XmlTableOptionsSegment) {
- walkXmlTableOptions((XmlTableOptionsSegment) expression);
- } else if (expression instanceof XmlTableColumnSegment) {
- walkExpression(((XmlTableColumnSegment)
expression).getDefaultExpr());
+ } else if (expression instanceof XmlPiFunctionSegment xmlPi) {
+ walkExpression(xmlPi.getEvalNameValueExpr());
+ walkExpression(xmlPi.getValueExpr());
+ } else if (expression instanceof XmlQueryAndExistsFunctionSegment
xmlQueryAndExists) {
+ xmlQueryAndExists.getParameters().forEach(this::walkExpression);
+ } else if (expression instanceof XmlSerializeFunctionSegment
xmlSerialize) {
+ walkExpression(xmlSerialize.getParameter());
+ } else if (expression instanceof XmlTableFunctionSegment xmlTable) {
+ walkXmlTableOptions(xmlTable.getXmlTableOption());
+ } else if (expression instanceof XmlTableOptionsSegment
xmlTableOptions) {
+ walkXmlTableOptions(xmlTableOptions);
+ } else if (expression instanceof XmlTableColumnSegment xmlTableColumn)
{
+ walkExpression(xmlTableColumn.getDefaultExpr());
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
index f7ce435605b..41b3e64ff57 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
@@ -27,8 +27,8 @@ import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMet
import
org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureQueryFacade;
import
org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
+import java.util.EnumSet;
import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -60,10 +60,10 @@ public final class SearchMetadataToolService {
*/
public MetadataSearchResult execute(final MetadataSearchRequest request) {
ShardingSpherePreconditions.checkState(request.getSchema().isEmpty()
|| !request.getDatabase().isEmpty(), () -> new
MCPInvalidRequestException("Schema cannot be provided without database."));
- Set<SupportedMCPMetadataObjectType> searchObjectTypes =
getSearchObjectTypes(request.getObjectTypes());
if (isBlankAllDatabaseSearch(request)) {
return executeBlankAllDatabaseSearch(request);
}
+ Set<SupportedMCPMetadataObjectType> searchObjectTypes =
getSearchObjectTypes(request.getObjectTypes());
return createSearchResult(collector.collect(request,
searchObjectTypes), request, searchObjectTypes, false);
}
@@ -148,14 +148,7 @@ public final class SearchMetadataToolService {
if (!objectTypes.isEmpty()) {
return objectTypes;
}
- Set<SupportedMCPMetadataObjectType> result = new LinkedHashSet<>();
- result.add(SupportedMCPMetadataObjectType.DATABASE);
- result.add(SupportedMCPMetadataObjectType.SCHEMA);
- result.add(SupportedMCPMetadataObjectType.TABLE);
- result.add(SupportedMCPMetadataObjectType.VIEW);
- result.add(SupportedMCPMetadataObjectType.COLUMN);
- result.add(SupportedMCPMetadataObjectType.INDEX);
- result.add(SupportedMCPMetadataObjectType.SEQUENCE);
- return result;
+ return EnumSet.of(SupportedMCPMetadataObjectType.DATABASE,
SupportedMCPMetadataObjectType.SCHEMA, SupportedMCPMetadataObjectType.TABLE,
SupportedMCPMetadataObjectType.VIEW,
+ SupportedMCPMetadataObjectType.COLUMN,
SupportedMCPMetadataObjectType.INDEX, SupportedMCPMetadataObjectType.SEQUENCE);
}
}
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
index 1ec9452d187..2299bc38d74 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
@@ -91,15 +91,14 @@ public final class WorkflowExecutionService {
if (!invalidArtifactResponse.isEmpty()) {
return invalidArtifactResponse;
}
- WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
if
(WorkflowLifecycle.EXECUTION_MODE_PREVIEW.equalsIgnoreCase(actualExecutionMode))
{
return previewApply(workflowSessionContext, snapshot);
}
if (isManualOnly(actualExecutionMode)) {
+ WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
return applyManualOnly(workflowSessionContext, snapshot,
applyOutcome);
}
- return applyAutomatically(workflowSessionContext, queryFacade,
executionFacade, workflowRuntimeHandler, sessionId, snapshot,
- actualExecutionMode, applyOutcome);
+ return applyAutomatically(workflowSessionContext, queryFacade,
executionFacade, workflowRuntimeHandler, sessionId, snapshot,
actualExecutionMode);
}
private String requireExecutionMode(final WorkflowContextSnapshot
snapshot, final String executionMode) {
@@ -225,11 +224,9 @@ public final class WorkflowExecutionService {
WorkflowLifecycle.EXECUTION_MODE_MANUAL_ONLY,
createArtifactPayload(snapshot));
}
- private Map<String, Object> applyAutomatically(final
WorkflowSessionContext workflowSessionContext, final MCPFeatureQueryFacade
queryFacade,
- final
MCPFeatureExecutionFacade executionFacade,
- final
MCPWorkflowRuntimeHandler workflowRuntimeHandler,
- final String sessionId,
final WorkflowContextSnapshot snapshot, final String executionMode,
- final WorkflowApplyOutcome
applyOutcome) {
+ private Map<String, Object> applyAutomatically(final
WorkflowSessionContext workflowSessionContext, final MCPFeatureQueryFacade
queryFacade, final MCPFeatureExecutionFacade executionFacade,
+ final
MCPWorkflowRuntimeHandler workflowRuntimeHandler, final String sessionId, final
WorkflowContextSnapshot snapshot, final String executionMode) {
+ WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
if
(WorkflowSecretReferenceUtils.hasSecretReferences(getRequest(snapshot))) {
return
failSecretReferenceManualExecutionRequired(workflowSessionContext, snapshot,
executionMode, applyOutcome);
}
diff --git
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
index 9e993bc45cd..32fe1440d7a 100644
---
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
+++
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
@@ -52,7 +52,12 @@ public final class BroadcastWorkflowRequest extends
WorkflowRequest {
return;
}
this.tables.clear();
- tables.stream().map(each -> null == each ? "" :
each.trim()).filter(each -> !each.isEmpty()).forEach(this.tables::add);
+ for (String each : tables) {
+ String normalizedValue = null == each ? "" : each.trim();
+ if (!normalizedValue.isEmpty()) {
+ this.tables.add(normalizedValue);
+ }
+ }
}
/**
@@ -100,8 +105,8 @@ public final class BroadcastWorkflowRequest extends
WorkflowRequest {
if (null == previousRequest) {
return new BroadcastWorkflowRequest();
}
- if (previousRequest instanceof BroadcastWorkflowRequest) {
- return ((BroadcastWorkflowRequest) previousRequest).copy();
+ if (previousRequest instanceof BroadcastWorkflowRequest request) {
+ return request.copy();
}
BroadcastWorkflowRequest result = new BroadcastWorkflowRequest();
copyFieldsTo(previousRequest, result);
diff --git
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
index f0a0ce6661d..8a6a79134e2 100644
---
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
+++
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
@@ -50,7 +50,9 @@ public final class BroadcastRuleDistSQLPlanningService {
}
private String formatTableNames(final List<String> tableNames) {
- return tableNames.stream().peek(each ->
WorkflowSQLUtils.checkSupportedIdentifier("table", each))
-
.map(WorkflowSQLUtils::formatGeneratedRuleDistSQLIdentifier).collect(Collectors.joining(",
"));
+ return tableNames.stream().map(each -> {
+ WorkflowSQLUtils.checkSupportedIdentifier("table", each);
+ return WorkflowSQLUtils.formatGeneratedRuleDistSQLIdentifier(each);
+ }).collect(Collectors.joining(", "));
}
}
diff --git
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
index 29ea836fc67..0261af4aee5 100644
---
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
+++
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
@@ -19,11 +19,18 @@ package
org.apache.shardingsphere.mcp.feature.broadcast.tool.model;
import org.apache.shardingsphere.mcp.support.workflow.model.WorkflowRequest;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
+import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.sameInstance;
class BroadcastWorkflowRequestTest {
@@ -35,6 +42,24 @@ class BroadcastWorkflowRequestTest {
assertThat(request.getTargetTables(), is(List.of("t_order",
"t_order_item")));
}
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("setTablesArguments")
+ void assertSetTablesFromCollection(final String scenario, final
Collection<String> values, final Collection<String> expectedValues) {
+ BroadcastWorkflowRequest request = new BroadcastWorkflowRequest();
+ Collection<String> actualValues = request.getTables();
+ actualValues.add("foo_previous");
+ request.setTables(values);
+ assertThat(request.getTables(), sameInstance(actualValues));
+ assertThat(actualValues, is(expectedValues));
+ }
+
+ private static Stream<Arguments> setTablesArguments() {
+ return Stream.of(
+ Arguments.of("null collection", null, List.of("foo_previous")),
+ Arguments.of("empty collection", List.of(),
List.of("foo_previous")),
+ Arguments.of("normalized values and duplicates",
Arrays.asList(null, "", " ", " foo_table ", "bar_value", "foo_table"),
List.of("foo_table", "bar_value", "foo_table")));
+ }
+
@Test
void assertGetTargetTablesFallsBackToTable() {
BroadcastWorkflowRequest request = new BroadcastWorkflowRequest();
diff --git
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
index 38b99b5363c..5fe104f81d0 100644
---
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
+++
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
@@ -84,8 +84,8 @@ public final class EncryptWorkflowRequest extends
WorkflowRequest {
if (null == previousRequest) {
return new EncryptWorkflowRequest();
}
- if (previousRequest instanceof EncryptWorkflowRequest) {
- return ((EncryptWorkflowRequest) previousRequest).copy();
+ if (previousRequest instanceof EncryptWorkflowRequest request) {
+ return request.copy();
}
EncryptWorkflowRequest result = new EncryptWorkflowRequest();
copyFieldsTo(previousRequest, result);
diff --git
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
index be569988465..f3b9eb931eb 100644
---
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
+++
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
@@ -66,8 +66,8 @@ public final class EncryptWorkflowApplyArtifactValidator
implements MCPWorkflowA
if (actualSQL.contains("encrypt_algorithm") &&
actualSQL.contains("'aes-key-value'") &&
!actualSQL.contains("'digest-algorithm-name'")) {
issues.add(validationSupport.createSQLExecutabilityIssue("Generated AES encrypt
DistSQL is missing `digest-algorithm-name`.", displaySql));
}
- if (snapshot.getRequest() instanceof EncryptWorkflowRequest) {
- addAlgorithmIssues(issues, (EncryptWorkflowRequest)
snapshot.getRequest(), displaySql);
+ if (snapshot.getRequest() instanceof EncryptWorkflowRequest request) {
+ addAlgorithmIssues(issues, request, displaySql);
}
}
diff --git
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
index b9305158860..dfd26685f0a 100644
---
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
+++
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
@@ -82,7 +82,12 @@ public final class ReadwriteSplittingRuleWorkflowRequest
extends WorkflowRequest
return;
}
this.readStorageUnits.clear();
- readStorageUnits.stream().map(each -> null == each ? "" :
each.trim()).filter(each ->
!each.isEmpty()).forEach(this.readStorageUnits::add);
+ for (String each : readStorageUnits) {
+ String normalizedValue = null == each ? "" : each.trim();
+ if (!normalizedValue.isEmpty()) {
+ this.readStorageUnits.add(normalizedValue);
+ }
+ }
}
/**
@@ -174,8 +179,8 @@ public final class ReadwriteSplittingRuleWorkflowRequest
extends WorkflowRequest
if (null == previousRequest) {
return new ReadwriteSplittingRuleWorkflowRequest();
}
- if (previousRequest instanceof ReadwriteSplittingRuleWorkflowRequest) {
- return ((ReadwriteSplittingRuleWorkflowRequest)
previousRequest).copy();
+ if (previousRequest instanceof ReadwriteSplittingRuleWorkflowRequest
request) {
+ return request.copy();
}
ReadwriteSplittingRuleWorkflowRequest result = new
ReadwriteSplittingRuleWorkflowRequest();
copyFieldsTo(previousRequest, result);
diff --git
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
index 850334e4e93..0def7971003 100644
---
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
+++
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
@@ -103,8 +103,8 @@ public final class ReadwriteSplittingStatusWorkflowRequest
extends WorkflowReque
if (null == previousRequest) {
return new ReadwriteSplittingStatusWorkflowRequest();
}
- if (previousRequest instanceof
ReadwriteSplittingStatusWorkflowRequest) {
- return ((ReadwriteSplittingStatusWorkflowRequest)
previousRequest).copy();
+ if (previousRequest instanceof ReadwriteSplittingStatusWorkflowRequest
request) {
+ return request.copy();
}
ReadwriteSplittingStatusWorkflowRequest result = new
ReadwriteSplittingStatusWorkflowRequest();
copyFieldsTo(previousRequest, result);
diff --git
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
index 5d1c97b0214..a6f2848ef59 100644
---
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
+++
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
@@ -19,12 +19,19 @@ package
org.apache.shardingsphere.mcp.feature.readwritesplitting.tool.model;
import org.apache.shardingsphere.mcp.support.workflow.model.WorkflowRequest;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.sameInstance;
import static org.junit.jupiter.api.Assertions.assertNull;
class ReadwriteSplittingRuleWorkflowRequestTest {
@@ -36,6 +43,24 @@ class ReadwriteSplittingRuleWorkflowRequestTest {
assertThat(actual.getReadStorageUnits(), is(List.of("read_ds_0",
"read_ds_1")));
}
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("setReadStorageUnitsArguments")
+ void assertSetReadStorageUnitsFromCollection(final String scenario, final
Collection<String> values, final Collection<String> expectedValues) {
+ ReadwriteSplittingRuleWorkflowRequest request = new
ReadwriteSplittingRuleWorkflowRequest();
+ Collection<String> actualValues = request.getReadStorageUnits();
+ actualValues.add("foo_previous");
+ request.setReadStorageUnits(values);
+ assertThat(request.getReadStorageUnits(), sameInstance(actualValues));
+ assertThat(actualValues, is(expectedValues));
+ }
+
+ private static Stream<Arguments> setReadStorageUnitsArguments() {
+ return Stream.of(
+ Arguments.of("null collection", null, List.of("foo_previous")),
+ Arguments.of("empty collection", List.of(),
List.of("foo_previous")),
+ Arguments.of("normalized values and duplicates",
Arrays.asList(null, "", " ", " foo_read ", "bar_value", "foo_read"),
List.of("foo_read", "bar_value", "foo_read")));
+ }
+
@Test
void assertSetReadStorageUnitsWithNullString() {
ReadwriteSplittingRuleWorkflowRequest actual = new
ReadwriteSplittingRuleWorkflowRequest();
diff --git
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
index 3d2db5b222c..cf58fd96bc6 100644
---
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
+++
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
@@ -63,8 +63,8 @@ public final class ShadowAlgorithmCleanupWorkflowRequest
extends WorkflowRequest
}
private static ShadowAlgorithmCleanupWorkflowRequest
copyPreviousRequest(final WorkflowRequest previousRequest) {
- if (previousRequest instanceof ShadowAlgorithmCleanupWorkflowRequest) {
- return ((ShadowAlgorithmCleanupWorkflowRequest)
previousRequest).copy();
+ if (previousRequest instanceof ShadowAlgorithmCleanupWorkflowRequest
request) {
+ return request.copy();
}
ShadowAlgorithmCleanupWorkflowRequest result = new
ShadowAlgorithmCleanupWorkflowRequest();
if (null != previousRequest) {
diff --git
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
index 127c7ca97ce..2a1010bb71c 100644
---
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
+++
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
@@ -38,6 +38,7 @@ public final class ShadowDefaultAlgorithmWorkflowRequest
extends WorkflowRequest
*
* @param algorithmType algorithm type
*/
+ @Override
public void setAlgorithmType(final String algorithmType) {
this.algorithmType = null == algorithmType ? "" : algorithmType.trim();
}
@@ -86,8 +87,8 @@ public final class ShadowDefaultAlgorithmWorkflowRequest
extends WorkflowRequest
}
private static ShadowDefaultAlgorithmWorkflowRequest
copyPreviousRequest(final WorkflowRequest previousRequest) {
- if (previousRequest instanceof ShadowDefaultAlgorithmWorkflowRequest) {
- return ((ShadowDefaultAlgorithmWorkflowRequest)
previousRequest).copy();
+ if (previousRequest instanceof ShadowDefaultAlgorithmWorkflowRequest
request) {
+ return request.copy();
}
ShadowDefaultAlgorithmWorkflowRequest result = new
ShadowDefaultAlgorithmWorkflowRequest();
if (null != previousRequest) {
diff --git
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
index a93be9c62af..1660e277816 100644
---
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
+++
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
@@ -83,6 +83,7 @@ public final class ShadowRuleWorkflowRequest extends
WorkflowRequest {
*
* @param algorithmType algorithm type
*/
+ @Override
public void setAlgorithmType(final String algorithmType) {
this.algorithmType = null == algorithmType ? "" : algorithmType.trim();
}
@@ -151,8 +152,8 @@ public final class ShadowRuleWorkflowRequest extends
WorkflowRequest {
}
private static ShadowRuleWorkflowRequest copyPreviousRequest(final
WorkflowRequest previousRequest) {
- if (previousRequest instanceof ShadowRuleWorkflowRequest) {
- return ((ShadowRuleWorkflowRequest) previousRequest).copy();
+ if (previousRequest instanceof ShadowRuleWorkflowRequest request) {
+ return request.copy();
}
ShadowRuleWorkflowRequest result = new ShadowRuleWorkflowRequest();
if (null != previousRequest) {
diff --git
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
index 0b8c34792b9..c1378d83165 100644
---
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
+++
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
@@ -73,12 +73,10 @@ public final class ShadowWorkflowValidationService
implements MCPWorkflowRuntime
if (!isCreateOrAlterShadowDistSQL(sql)) {
return;
}
- if (snapshot.getRequest() instanceof ShadowRuleWorkflowRequest) {
- ShadowRuleWorkflowRequest request = (ShadowRuleWorkflowRequest)
snapshot.getRequest();
+ if (snapshot.getRequest() instanceof ShadowRuleWorkflowRequest
request) {
addShadowAlgorithmIssue(issues, request.getAlgorithmType(),
request.getAlgorithmProperties(), displaySql);
}
- if (snapshot.getRequest() instanceof
ShadowDefaultAlgorithmWorkflowRequest) {
- ShadowDefaultAlgorithmWorkflowRequest request =
(ShadowDefaultAlgorithmWorkflowRequest) snapshot.getRequest();
+ if (snapshot.getRequest() instanceof
ShadowDefaultAlgorithmWorkflowRequest request) {
addShadowAlgorithmIssue(issues, request.getAlgorithmType(),
request.getAlgorithmProperties(), displaySql);
}
}
diff --git
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
index b4c40c95db7..19505b78cdc 100644
---
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
+++
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
@@ -79,7 +79,7 @@ public final class ShardingWorkflowRequest extends
WorkflowRequest {
}
private static ShardingWorkflowRequest copyPreviousRequest(final
WorkflowRequest previous) {
- return previous instanceof ShardingWorkflowRequest ?
((ShardingWorkflowRequest) previous).copy() : copyFieldsTo(previous, new
ShardingWorkflowRequest());
+ return previous instanceof ShardingWorkflowRequest request ?
request.copy() : copyFieldsTo(previous, new ShardingWorkflowRequest());
}
@Override
diff --git
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
index 9879ee07b65..8709c2d77f7 100644
---
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
+++
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
@@ -207,10 +207,10 @@ public final class ShardingWorkflowPlanningService {
private WorkflowContextSnapshot planLifecycleWorkflow(final
WorkflowSessionContext workflowSessionContext, final ShardingWorkflowRequest
request,
final
ShardingWorkflowLifecycleSpec spec) {
WorkflowContextSnapshot result =
prepareSnapshot(workflowSessionContext, request, spec.workflowKind(),
spec.defaultOperationType(), spec.summary());
- ShardingWorkflowRequest mergedRequest = (ShardingWorkflowRequest)
result.getRequest();
if
(!planningSupport.ensureSupportedOperationType(result.getClarifiedIntent(),
SUPPORTED_LIFECYCLE_OPERATION_TYPES, result)) {
return
planningSupport.persistPlanningInterruption(workflowSessionContext, result);
}
+ ShardingWorkflowRequest mergedRequest = (ShardingWorkflowRequest)
result.getRequest();
if (!inputValidator.ensureDatabase(mergedRequest, result)) {
return workflowSessionContext.persist(result,
WorkflowLifecycle.STEP_CLARIFYING, result.getStatus());
}
diff --git
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
index 89aeb59f738..b05eeb02051 100644
---
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
+++
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
@@ -64,23 +64,19 @@ public final class ShardingWorkflowValidationService
implements MCPWorkflowRunti
queryFacade.checkDatabaseCapability(request.getDatabase());
if
(ShardingFeatureDefinition.TABLE_RULE_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
{
List<Map<String, Object>> rows =
inspectionService.queryTableRule(queryFacade, request.getDatabase(),
request.getTable());
- return validateNamedState(snapshot, validationReport, rows,
queryFacade, request.getDatabase(), "table", request.getTable(),
- matchesTableRule(rows, queryFacade, request));
+ return validateNamedState(snapshot, validationReport, rows,
queryFacade, "table", request.getTable(), matchesTableRule(rows, queryFacade,
request));
}
if
(ShardingFeatureDefinition.TABLE_REFERENCE_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
{
List<Map<String, Object>> rows =
inspectionService.queryTableReferenceRule(queryFacade, request.getDatabase(),
request.getRuleName());
- return validateNamedState(snapshot, validationReport, rows,
queryFacade, request.getDatabase(), "name", request.getRuleName(),
- matchesTableReferenceRule(rows, queryFacade, request));
+ return validateNamedState(snapshot, validationReport, rows,
queryFacade, "name", request.getRuleName(), matchesTableReferenceRule(rows,
queryFacade, request));
}
if
(ShardingFeatureDefinition.KEY_GENERATOR_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
{
List<Map<String, Object>> rows =
inspectionService.queryKeyGenerator(queryFacade, request.getDatabase(),
request.getKeyGeneratorName());
- return validateNamedState(snapshot, validationReport, rows,
queryFacade, request.getDatabase(), "name", request.getKeyGeneratorName(),
- matchesKeyGenerator(rows, queryFacade, request));
+ return validateNamedState(snapshot, validationReport, rows,
queryFacade, "name", request.getKeyGeneratorName(), matchesKeyGenerator(rows,
queryFacade, request));
}
if
(ShardingFeatureDefinition.KEY_GENERATE_STRATEGY_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
{
List<Map<String, Object>> rows =
inspectionService.queryKeyGenerateStrategy(queryFacade, request.getDatabase(),
request.getKeyGenerateStrategyName());
- return validateNamedState(snapshot, validationReport, rows,
queryFacade, request.getDatabase(), "name",
request.getKeyGenerateStrategyName(),
- matchesKeyGenerateStrategy(rows, queryFacade, request));
+ return validateNamedState(snapshot, validationReport, rows,
queryFacade, "name", request.getKeyGenerateStrategyName(),
matchesKeyGenerateStrategy(rows, queryFacade, request));
}
if
(ShardingFeatureDefinition.DEFAULT_STRATEGY_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
{
return validateDefaultStrategy(snapshot, validationReport,
inspectionService.queryDefaultStrategy(queryFacade, request.getDatabase()),
queryFacade, request);
@@ -88,10 +84,9 @@ public final class ShardingWorkflowValidationService
implements MCPWorkflowRunti
return validateCleanup(validationReport, queryFacade, request);
}
- private ValidationSection validateNamedState(final WorkflowContextSnapshot
snapshot, final ValidationReport validationReport,
- final List<Map<String,
Object>> rows, final MCPFeatureQueryFacade queryFacade, final String
databaseName,
- final String fieldName, final
String expected, final boolean shapeMatches) {
- boolean ruleExists = containsNamedRow(rows, queryFacade, databaseName,
fieldName, expected);
+ private ValidationSection validateNamedState(final WorkflowContextSnapshot
snapshot, final ValidationReport validationReport, final List<Map<String,
Object>> rows,
+ final MCPFeatureQueryFacade
queryFacade, final String fieldName, final String expected, final boolean
shapeMatches) {
+ boolean ruleExists = containsNamedRow(rows, queryFacade,
snapshot.getRequest().getDatabase(), fieldName, expected);
boolean dropWorkflow = WorkflowLifecycleUtils.isDropWorkflow(snapshot);
boolean expectedRuleExists = !dropWorkflow;
if (expectedRuleExists != ruleExists) {
diff --git
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
index f23dda1317b..c24b6137ee6 100644
---
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
+++
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
@@ -220,8 +220,7 @@ public final class MCPRegistryMetadataCommand {
private static void validateString(final Map<String, Object> target, final
String key, final int maxLength) {
Object value = target.get(key);
- ShardingSpherePreconditions.checkState(value instanceof String &&
!((String) value).isBlank(),
- () -> new IllegalArgumentException("server.json field " + key
+ " must be a non-empty string."));
+ ShardingSpherePreconditions.checkState(value instanceof String string
&& !string.isBlank(), () -> new IllegalArgumentException("server.json field " +
key + " must be a non-empty string."));
ShardingSpherePreconditions.checkState(((String) value).length() <=
maxLength,
() -> new IllegalArgumentException("server.json field " + key
+ " must be at most " + maxLength + " characters."));
}
@@ -237,8 +236,7 @@ public final class MCPRegistryMetadataCommand {
}
private static void validateHttpUrl(final Object value) {
- ShardingSpherePreconditions.checkState(value instanceof String &&
!((String) value).isBlank(),
- () -> new IllegalArgumentException("streamable-http transport
must define a URL."));
+ ShardingSpherePreconditions.checkState(value instanceof String string
&& !string.isBlank(), () -> new IllegalArgumentException("streamable-http
transport must define a URL."));
try {
URI uri = new URI((String) value);
ShardingSpherePreconditions.checkState(("http".equals(uri.getScheme()) ||
"https".equals(uri.getScheme())) && null != uri.getHost(),
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
index b681f30d496..c0cfe077a3d 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
@@ -23,7 +23,7 @@ import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierCon
import
org.apache.shardingsphere.mcp.support.database.metadata.TransactionCapability;
import
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
-import java.util.LinkedHashSet;
+import java.util.EnumSet;
import java.util.Set;
/**
@@ -65,12 +65,8 @@ public final class MCPDatabaseCapability {
}
private Set<SupportedMCPMetadataObjectType>
createSupportedMetadataObjectTypes(final MCPDatabaseCapabilityOption option) {
- Set<SupportedMCPMetadataObjectType> result = new LinkedHashSet<>(16,
1F);
- result.add(SupportedMCPMetadataObjectType.SCHEMA);
- result.add(SupportedMCPMetadataObjectType.TABLE);
- result.add(SupportedMCPMetadataObjectType.VIEW);
- result.add(SupportedMCPMetadataObjectType.COLUMN);
- result.add(SupportedMCPMetadataObjectType.INDEX);
+ Set<SupportedMCPMetadataObjectType> result =
EnumSet.of(SupportedMCPMetadataObjectType.SCHEMA,
SupportedMCPMetadataObjectType.TABLE, SupportedMCPMetadataObjectType.VIEW,
+ SupportedMCPMetadataObjectType.COLUMN,
SupportedMCPMetadataObjectType.INDEX);
if (option.getSequenceQuery().isPresent()) {
result.add(SupportedMCPMetadataObjectType.SEQUENCE);
}
@@ -78,11 +74,7 @@ public final class MCPDatabaseCapability {
}
private Set<SupportedMCPStatement> createSupportedStatementClasses(final
TransactionCapability transactionCapability, final boolean explainSupported) {
- Set<SupportedMCPStatement> result = new LinkedHashSet<>(16, 1F);
- result.add(SupportedMCPStatement.QUERY);
- result.add(SupportedMCPStatement.DML);
- result.add(SupportedMCPStatement.DDL);
- result.add(SupportedMCPStatement.DCL);
+ Set<SupportedMCPStatement> result =
EnumSet.of(SupportedMCPStatement.QUERY, SupportedMCPStatement.DML,
SupportedMCPStatement.DDL, SupportedMCPStatement.DCL);
if (TransactionCapability.NONE != transactionCapability) {
result.add(SupportedMCPStatement.TRANSACTION_CONTROL);
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
index 2da618aa287..045d878250f 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
@@ -75,21 +75,23 @@ public final class MCPJDBCExceptionClassifier {
if (!visited.add(current)) {
continue;
}
- if (current instanceof MCPDatabaseQueryFailedException) {
- return ((MCPDatabaseQueryFailedException)
current).getCategory();
- }
- if (current instanceof MCPDatabaseSQLSyntaxException) {
- return MCPJDBCErrorCategory.SYNTAX;
- }
- if (current instanceof SQLException) {
- Optional<MCPJDBCErrorCategory> category =
classifySQLException(dialectClassifier, (SQLException) current);
- if (category.isPresent() && MCPJDBCErrorCategory.QUERY_FAILED
!= category.get()) {
- return category.get();
- }
- if (category.isEmpty() && current instanceof
SQLSyntaxErrorException) {
- candidate = MCPJDBCErrorCategory.SYNTAX;
- }
- addIfPresent(pending, ((SQLException)
current).getNextException());
+ switch (current) {
+ case MCPDatabaseQueryFailedException ex:
+ return ex.getCategory();
+ case MCPDatabaseSQLSyntaxException ignored:
+ return MCPJDBCErrorCategory.SYNTAX;
+ case SQLException ex:
+ Optional<MCPJDBCErrorCategory> category =
classifySQLException(dialectClassifier, ex);
+ if (category.isPresent() &&
MCPJDBCErrorCategory.QUERY_FAILED != category.get()) {
+ return category.get();
+ }
+ if (category.isEmpty() && current instanceof
SQLSyntaxErrorException) {
+ candidate = MCPJDBCErrorCategory.SYNTAX;
+ }
+ addIfPresent(pending, ex.getNextException());
+ break;
+ default:
+ break;
}
addIfPresent(pending, current.getCause());
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
index b38b12b9404..d0047978a7b 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
@@ -47,12 +47,9 @@ public final class FirebirdMCPDialectSQLExceptionClassifier
implements MCPDialec
switch (cause.getErrorCode()) {
case NO_PERMISSION:
return Optional.of(MCPJDBCErrorCategory.AUTHORIZATION);
- case LOGIN:
- case LOGIN_ERROR:
+ case LOGIN, LOGIN_ERROR:
return Optional.of(MCPJDBCErrorCategory.AUTHENTICATION);
- case COLUMN_UNKNOWN:
- case TABLE_UNKNOWN:
- case PROCEDURE_UNKNOWN:
+ case COLUMN_UNKNOWN, TABLE_UNKNOWN, PROCEDURE_UNKNOWN:
return Optional.of(MCPJDBCErrorCategory.OBJECT_NOT_VISIBLE);
case TOKEN_UNKNOWN:
return Optional.of(MCPJDBCErrorCategory.SYNTAX);
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
index 3324f229da4..f129c1080e9 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
@@ -54,17 +54,11 @@ public final class MySQLMCPDialectSQLExceptionClassifier
implements MCPDialectSQ
return Optional.empty();
}
switch (cause.getErrorCode()) {
- case ER_DBACCESS_DENIED_ERROR:
- case ER_TABLEACCESS_DENIED_ERROR:
- case ER_COLUMNACCESS_DENIED_ERROR:
- case ER_SPECIFIC_ACCESS_DENIED_ERROR:
- case ER_PROCACCESS_DENIED_ERROR:
+ case ER_DBACCESS_DENIED_ERROR, ER_TABLEACCESS_DENIED_ERROR,
ER_COLUMNACCESS_DENIED_ERROR, ER_SPECIFIC_ACCESS_DENIED_ERROR,
ER_PROCACCESS_DENIED_ERROR:
return Optional.of(MCPJDBCErrorCategory.AUTHORIZATION);
- case ER_BAD_DB_ERROR:
- case ER_SP_DOES_NOT_EXIST:
+ case ER_BAD_DB_ERROR, ER_SP_DOES_NOT_EXIST:
return Optional.of(MCPJDBCErrorCategory.OBJECT_NOT_VISIBLE);
- case ER_PARSE_ERROR:
- case ER_SYNTAX_ERROR:
+ case ER_PARSE_ERROR, ER_SYNTAX_ERROR:
return Optional.of(MCPJDBCErrorCategory.SYNTAX);
default:
return Optional.of(MCPJDBCErrorCategory.QUERY_FAILED);
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
index de2b6712d5a..0927c3067cf 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
@@ -228,6 +228,6 @@ public final class MCPToolInputSchemaValidator {
}
private static BigInteger toBigInteger(final Object value) {
- return value instanceof BigInteger ? (BigInteger) value :
BigInteger.valueOf(((Number) value).longValue());
+ return value instanceof BigInteger bigInteger ? bigInteger :
BigInteger.valueOf(((Number) value).longValue());
}
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
index b53bc93a28f..a4c042dbccf 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
@@ -36,7 +36,7 @@ public final class UniqueMCPPromptArgumentNamesValidator
implements ConstraintVa
return true;
}
Set<String> names = new HashSet<>(value.size(), 1F);
- return value.stream().map(each -> (YamlMCPPromptArgumentDescriptor)
each)
+ return value.stream().map(YamlMCPPromptArgumentDescriptor.class::cast)
.noneMatch(argument -> null != argument && null !=
argument.getName() && !argument.getName().isBlank() &&
!names.add(argument.getName()));
}
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
index 799676f49f5..437eed40162 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
@@ -82,8 +82,8 @@ public final class MCPItemsPayload implements
MCPSuccessPayload {
private String resolveContinuationMode() {
Object value = navigation.get(CONTINUATION_MODE);
- if (value instanceof String && !((String) value).isEmpty()) {
- return value.toString();
+ if (value instanceof String continuationMode &&
!continuationMode.isEmpty()) {
+ return continuationMode;
}
return null == nextPageToken || nextPageToken.isEmpty() ?
CONTINUATION_MODE_NONE : CONTINUATION_MODE_PAGINATION;
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
index 70ed6356447..5247cab9c4e 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
@@ -52,20 +52,21 @@ public final class MCPUriPathSegmentUtils {
*/
public static Optional<String> decodePathSegment(final String pathSegment)
{
StringBuilder result = new StringBuilder(pathSegment.length());
- for (int i = 0; i < pathSegment.length();) {
- if ('%' != pathSegment.charAt(i)) {
- result.append(pathSegment.charAt(i));
- i++;
+ int index = 0;
+ while (index < pathSegment.length()) {
+ if ('%' != pathSegment.charAt(index)) {
+ result.append(pathSegment.charAt(index));
+ index++;
continue;
}
ByteArrayOutputStream encodedBytes = new ByteArrayOutputStream();
- while (i < pathSegment.length() && '%' == pathSegment.charAt(i)) {
- Optional<Integer> decodedByte =
decodePercentEncodedByte(pathSegment, i);
+ while (index < pathSegment.length() && '%' ==
pathSegment.charAt(index)) {
+ Optional<Integer> decodedByte =
decodePercentEncodedByte(pathSegment, index);
if (decodedByte.isEmpty()) {
return Optional.empty();
}
encodedBytes.write(decodedByte.get());
- i += 3;
+ index += 3;
}
Optional<String> decodedText =
decodeUtf8(encodedBytes.toByteArray());
if (decodedText.isEmpty()) {
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
index 5aea0b2751f..7e2d5054f57 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
@@ -24,6 +24,7 @@ import lombok.RequiredArgsConstructor;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.regex.Pattern;
/**
* Secret reference value.
@@ -34,6 +35,8 @@ public final class SecretReferenceValue {
private static final String PLACEHOLDER_PREFIX = "secret_reference:";
+ private static final Pattern MANUAL_PLACEHOLDER_SEPARATOR_PATTERN =
Pattern.compile("[^A-Z0-9]+");
+
private final boolean malformed;
/**
@@ -109,7 +112,7 @@ public final class SecretReferenceValue {
}
private static String normalizeForManualPlaceholder(final String value) {
- String result =
normalize(value).toUpperCase(Locale.ENGLISH).replaceAll("[^A-Z0-9]+", "_");
+ String result =
MANUAL_PLACEHOLDER_SEPARATOR_PATTERN.matcher(normalize(value).toUpperCase(Locale.ENGLISH)).replaceAll("_");
return result.isEmpty() ? "VALUE" : result;
}
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
index e9b79bb1b31..c9fe5f59157 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
@@ -110,8 +110,8 @@ public final class WorkflowAlgorithmUtils {
if (null == value) {
return Map.of();
}
- if (value instanceof Properties) {
- return createPropertyMap((Properties) value);
+ if (value instanceof Properties props) {
+ return createPropertyMap(props);
}
if (value instanceof Map) {
return createPropertyMap((Map<?, ?>) value);
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
index 59bca545b75..63a99e5e794 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
@@ -54,7 +54,7 @@ public final class WorkflowPlanningArguments {
*/
public Boolean getBooleanArgument(final String name) {
Object result = arguments.get(name);
- return result instanceof Boolean ? (Boolean) result : null;
+ return result instanceof Boolean booleanValue ? booleanValue : null;
}
/**
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
index d2316b3d947..16cfd5a079e 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
@@ -31,6 +31,7 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeMap;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -39,7 +40,7 @@ import java.util.stream.Collectors;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class WorkflowSQLUtils {
- private static final String UNQUOTED_IDENTIFIER_PATTERN =
"[A-Za-z_][A-Za-z0-9_$]*";
+ private static final Pattern UNQUOTED_IDENTIFIER_PATTERN =
Pattern.compile("[A-Za-z_][A-Za-z0-9_$]*");
private static final Set<String> DIST_SQL_RESERVED_IDENTIFIERS = Set.of(
"address_random_replace", "aes", "algorithm", "alter", "and",
"assisted_query", "assisted_query_algorithm", "assisted_query_column", "by",
"cipher", "column", "columns", "count",
@@ -205,11 +206,11 @@ public final class WorkflowSQLUtils {
}
private static boolean isSpecialDistSQLIdentifier(final String identifier)
{
- return !identifier.matches(UNQUOTED_IDENTIFIER_PATTERN) ||
DIST_SQL_RESERVED_IDENTIFIERS.contains(identifier.toLowerCase(Locale.ENGLISH));
+ return !UNQUOTED_IDENTIFIER_PATTERN.matcher(identifier).matches() ||
DIST_SQL_RESERVED_IDENTIFIERS.contains(identifier.toLowerCase(Locale.ENGLISH));
}
private static boolean isSpecialSQLIdentifier(final String identifier) {
- return !identifier.matches(UNQUOTED_IDENTIFIER_PATTERN);
+ return !UNQUOTED_IDENTIFIER_PATTERN.matcher(identifier).matches();
}
private static QuoteCharacter getQuoteCharacter(final String identifier) {
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
index 9b0b12a0c5e..f57a0f7b696 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
@@ -181,8 +181,6 @@ public final class WorkflowSecretReferenceUtils {
private static SecretReferenceValue createSecretReferenceValue(final
Map<?, ?> value) {
Object secretRef = value.get(SECRET_REF);
- return secretRef instanceof String && !((String)
secretRef).trim().isEmpty()
- ? SecretReferenceValue.create()
- : SecretReferenceValue.malformed();
+ return secretRef instanceof String stringValue &&
!stringValue.trim().isEmpty() ? SecretReferenceValue.create() :
SecretReferenceValue.malformed();
}
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
index 2e41627c676..5ae8036b891 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
@@ -58,6 +58,6 @@ public final class WorkflowRuntimeDefinition {
}
private static MCPWorkflowApplyArtifactValidator
createApplyArtifactValidator(final MCPWorkflowRuntimeHandler runtimeHandler) {
- return runtimeHandler instanceof MCPWorkflowApplyArtifactValidator ?
(MCPWorkflowApplyArtifactValidator) runtimeHandler :
MCPWorkflowApplyArtifactValidator.NO_OP;
+ return runtimeHandler instanceof MCPWorkflowApplyArtifactValidator
validator ? validator : MCPWorkflowApplyArtifactValidator.NO_OP;
}
}