This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new cfd6d3ce3fa Refactor ConvertYamlConfigurationHandler (#19371)
cfd6d3ce3fa is described below
commit cfd6d3ce3fa800153fec4ea0dd2dfd2c5244bc25
Author: Raigor <[email protected]>
AuthorDate: Wed Jul 20 11:43:56 2022 +0800
Refactor ConvertYamlConfigurationHandler (#19371)
* Refactor ConvertYamlConfigurationHandler
* Add TODO.
* Remove `String.format` when call Preconditions' method.
---
.../common/constant/DistSQLScriptConstants.java | 66 ++++++++++++
.../queryable/ConvertYamlConfigurationHandler.java | 115 +++++++++++----------
2 files changed, 129 insertions(+), 52 deletions(-)
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
new file mode 100644
index 00000000000..5f24c109a14
--- /dev/null
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.proxy.backend.text.distsql.ral.common.constant;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * DistSQL script constants.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DistSQLScriptConstants {
+
+ public static final String COMMA = ",";
+
+ public static final String SEMI = ";";
+
+ public static final String CREATE_DATABASE = "CREATE DATABASE %s;";
+
+ public static final String USE_DATABASE = "USE %s;";
+
+ public static final String ADD_RESOURCE = "ADD RESOURCE";
+
+ public static final String KEY_URL = "url";
+
+ public static final String KEY_USERNAME = "username";
+
+ public static final String KEY_PASSWORD = "password";
+
+ public static final String RESOURCE_DEFINITION = " %s ("
+ + System.lineSeparator()
+ + "URL=\"%s\","
+ + System.lineSeparator()
+ + "USER=%s,"
+ + System.lineSeparator()
+ + "PASSWORD=\"%s\","
+ + System.lineSeparator()
+ + "PROPERTIES(%s)"
+ + ")";
+
+ public static final String RESOURCE_DEFINITION_WITHOUT_PASSWORD = " %s ("
+ + System.lineSeparator()
+ + "URL=\"%s\","
+ + System.lineSeparator()
+ + "USER=%s,"
+ + System.lineSeparator()
+ + "PROPERTIES(%s)"
+ + ")";
+
+ public static final String PROPERTY = "\"%s\"=\"%s\"";
+}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
index f8e7a421762..609eeefb3af 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
@@ -17,10 +17,14 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.ral.queryable;
+import com.google.common.base.Preconditions;
import com.zaxxer.hikari.HikariDataSource;
+import org.apache.commons.lang3.StringUtils;
import
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
import
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
+import
org.apache.shardingsphere.infra.datasource.props.custom.CustomDataSourceProperties;
+import
org.apache.shardingsphere.infra.datasource.props.synonym.PoolPropertySynonyms;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
@@ -29,33 +33,26 @@ import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceCo
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyDataSourceConfigurationSwapper;
import
org.apache.shardingsphere.proxy.backend.text.distsql.ral.QueryableRALBackendHandler;
+import
org.apache.shardingsphere.proxy.backend.text.distsql.ral.common.constant.DistSQLScriptConstants;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
-import java.util.LinkedHashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
/**
- * Convert database configuration handler.
+ * Convert yaml configuration handler.
*/
public class ConvertYamlConfigurationHandler extends
QueryableRALBackendHandler<ConvertYamlConfigurationStatement> {
- private static final String CREATE_DATABASE = "CREATE DATABASE %s;";
-
- private static final String ADD_RESOURCE = "ADD RESOURCE";
-
- private static final String RESOURCES = " %s (" + System.lineSeparator()
- + "%s"
- + " PROPERTIES(%s)" + System.lineSeparator()
- + "),";
-
private final YamlProxyDataSourceConfigurationSwapper
dataSourceConfigSwapper = new YamlProxyDataSourceConfigurationSwapper();
@Override
protected Collection<String> getColumnNames() {
- return Collections.singleton("converted_distsql");
+ return Collections.singleton("distsql");
}
@Override
@@ -67,61 +64,75 @@ public class ConvertYamlConfigurationHandler extends
QueryableRALBackendHandler<
} catch (final IOException ex) {
throw new ShardingSphereException(ex);
}
- String convertedDistSQL = generateConvertedDistSQL(yamlConfig);
- return Collections.singleton(new
LocalDataQueryResultRow(convertedDistSQL));
+ Preconditions.checkNotNull(yamlConfig, "Invalid yaml file `%s`",
file.getName());
+ Preconditions.checkNotNull(yamlConfig.getDatabaseName(),
"`databaseName` in file `%s` is required.", file.getName());
+ return Collections.singleton(new
LocalDataQueryResultRow(generateDistSQL(yamlConfig)));
}
- private String generateConvertedDistSQL(final
YamlProxyDatabaseConfiguration yamlConfig) {
- StringBuilder convetedDistSQL = new StringBuilder();
- appendCreateDatabaseDistSQL(yamlConfig.getDatabaseName(),
convetedDistSQL);
- appendAddResourceDistSQL(yamlConfig.getDataSources(), convetedDistSQL);
- return convetedDistSQL.toString();
+ private String generateDistSQL(final YamlProxyDatabaseConfiguration
yamlConfig) {
+ StringBuilder result = new StringBuilder();
+ appendDatabase(yamlConfig.getDatabaseName(), result);
+ appendResources(yamlConfig.getDataSources(), result);
+ // TODO append rules by feature SPI
+ return result.toString();
}
- private void appendCreateDatabaseDistSQL(final String databaseName, final
StringBuilder stringBuilder) {
- if (databaseName.isEmpty()) {
- return;
- }
- stringBuilder.append(String.format(CREATE_DATABASE, databaseName));
+ private void appendDatabase(final String databaseName, final StringBuilder
stringBuilder) {
+
stringBuilder.append(String.format(DistSQLScriptConstants.CREATE_DATABASE,
databaseName)).append(System.lineSeparator());
+
stringBuilder.append(String.format(DistSQLScriptConstants.USE_DATABASE,
databaseName)).append(System.lineSeparator());
}
- private void appendAddResourceDistSQL(final Map<String,
YamlProxyDataSourceConfiguration> yamlDataSourceMap, final StringBuilder
stringBuilder) {
- if (yamlDataSourceMap.isEmpty()) {
+ private void appendResources(final Map<String,
YamlProxyDataSourceConfiguration> dataSources, final StringBuilder
stringBuilder) {
+ if (dataSources.isEmpty()) {
return;
}
- if (null == stringBuilder) {
- stringBuilder.append(ADD_RESOURCE);
- } else {
- stringBuilder.append(String.format(System.lineSeparator() +
System.lineSeparator() + ADD_RESOURCE));
+ stringBuilder.append(DistSQLScriptConstants.ADD_RESOURCE);
+ Iterator<Entry<String, YamlProxyDataSourceConfiguration>> iterator =
dataSources.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry<String, YamlProxyDataSourceConfiguration> entry =
iterator.next();
+ DataSourceProperties dataSourceProperties =
DataSourcePropertiesCreator.create(HikariDataSource.class.getName(),
dataSourceConfigSwapper.swap(entry.getValue()));
+ appendResource(entry.getKey(), dataSourceProperties,
stringBuilder);
+ if (iterator.hasNext()) {
+
stringBuilder.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
+ }
}
- Map<String, DataSourceProperties> dataSourcePropsMap = new
LinkedHashMap<>(yamlDataSourceMap.size(), 1);
- for (Map.Entry<String, YamlProxyDataSourceConfiguration> entry :
yamlDataSourceMap.entrySet()) {
- dataSourcePropsMap.put(entry.getKey(),
DataSourcePropertiesCreator.create(HikariDataSource.class.getName(),
dataSourceConfigSwapper.swap(entry.getValue())));
+ stringBuilder.append(DistSQLScriptConstants.SEMI);
+ }
+
+ private void appendResource(final String resourceName, final
DataSourceProperties dataSourceProperties, final StringBuilder stringBuilder) {
+ Map<String, Object> connectionProperties =
dataSourceProperties.getConnectionPropertySynonyms().getStandardProperties();
+ String url = (String)
connectionProperties.get(DistSQLScriptConstants.KEY_URL);
+ String username = (String)
connectionProperties.get(DistSQLScriptConstants.KEY_USERNAME);
+ String password = (String)
connectionProperties.get(DistSQLScriptConstants.KEY_PASSWORD);
+ String props =
getResourceProperties(dataSourceProperties.getPoolPropertySynonyms(),
dataSourceProperties.getCustomDataSourceProperties());
+ if (StringUtils.isNotEmpty(password)) {
+
stringBuilder.append(String.format(DistSQLScriptConstants.RESOURCE_DEFINITION,
resourceName, url, username, password, props));
+ } else {
+
stringBuilder.append(String.format(DistSQLScriptConstants.RESOURCE_DEFINITION_WITHOUT_PASSWORD,
resourceName, url, username, props));
}
- stringBuilder.append(ADD_RESOURCE);
- dataSourcePropsMap.forEach((key, value) -> addResources(key, value,
stringBuilder));
- stringBuilder.deleteCharAt(stringBuilder.length() - 1).append(";");
}
- private void addResources(final String resourceName, final
DataSourceProperties properties, final StringBuilder stringBuilder) {
- String connectProperties = new String();
- String poolProperties = new String();
- for (Map.Entry<String, Object> entry :
properties.getConnectionPropertySynonyms().getStandardProperties().entrySet()) {
- connectProperties = connectProperties.concat(String.format("
%s=%s," + System.lineSeparator(), entry.getKey(), entry.getValue()));
+ private String getResourceProperties(final PoolPropertySynonyms
poolPropertySynonyms, final CustomDataSourceProperties
customDataSourceProperties) {
+ StringBuilder result = new StringBuilder();
+ appendProperties(poolPropertySynonyms.getStandardProperties(), result);
+ if (!customDataSourceProperties.getProperties().isEmpty()) {
+ result.append(DistSQLScriptConstants.COMMA);
+ appendProperties(customDataSourceProperties.getProperties(),
result);
}
- for (Map.Entry<String, Object> entry :
properties.getPoolPropertySynonyms().getStandardProperties().entrySet()) {
- if (null != entry.getValue()) {
- poolProperties =
poolProperties.concat(String.format("\"%s\"=%s, ", entry.getKey(),
entry.getValue()));
+ return result.toString();
+ }
+
+ private void appendProperties(final Map<String, Object> properties, final
StringBuilder stringBuilder) {
+ Iterator<Entry<String, Object>> iterator =
properties.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry<String, Object> entry = iterator.next();
+ if (null == entry.getValue()) {
+ continue;
}
- }
- for (Map.Entry<String, Object> entry :
properties.getCustomDataSourceProperties().getProperties().entrySet()) {
- if (entry.getValue().equals(false) ||
entry.getValue().equals(true)) {
- poolProperties =
poolProperties.concat(String.format("\"%s\"=%s, ", entry.getKey(),
entry.getValue()));
- } else {
- poolProperties =
poolProperties.concat(String.format("\"%s\"=\"%s\", ", entry.getKey(),
entry.getValue()));
+
stringBuilder.append(String.format(DistSQLScriptConstants.PROPERTY,
entry.getKey(), entry.getValue()));
+ if (iterator.hasNext()) {
+ stringBuilder.append(DistSQLScriptConstants.COMMA);
}
}
- poolProperties = poolProperties.substring(0, poolProperties.length() -
2);
- stringBuilder.append(String.format(RESOURCES, resourceName,
connectProperties, poolProperties));
}
}