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

Reply via email to