You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/06/25 16:48:41 UTC
[shardingsphere] branch master updated: Improve ExportDatabaseConfigurationHandler (#18593)
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 064509895e7 Improve ExportDatabaseConfigurationHandler (#18593)
064509895e7 is described below
commit 064509895e7c7bcbdb59480fbf4e79e9d1ebd97f
Author: 小马哥 <77...@users.noreply.github.com>
AuthorDate: Sun Jun 26 00:48:35 2022 +0800
Improve ExportDatabaseConfigurationHandler (#18593)
---
.../representer/processor/NoneYamlTupleProcessor.java | 7 ++++++-
.../shardingsphere/infra/yaml/engine/YamlEngine.java | 18 +++++++++++++++++-
.../processor/DefaultYamlTupleProcessor.java | 3 ++-
.../queryable/ExportDatabaseConfigurationHandler.java | 8 +++++++-
.../expected/export-database-configuration.yaml | 8 +-------
5 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
index a00cc868881..e27ce7cdbdd 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.sharding.yaml.engine.representer.processor;
import org.apache.shardingsphere.infra.yaml.engine.representer.processor.ShardingSphereYamlTupleProcessor;
import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeTuple;
import org.yaml.snakeyaml.nodes.ScalarNode;
@@ -36,13 +37,17 @@ public final class NoneYamlTupleProcessor implements ShardingSphereYamlTupleProc
@Override
public NodeTuple process(final NodeTuple nodeTuple) {
- return isNullNode(nodeTuple.getValueNode()) ? null : processNoneTuple(nodeTuple);
+ return (isNullNode(nodeTuple.getValueNode()) || isEmptyMappingNode(nodeTuple.getValueNode())) ? null : processNoneTuple(nodeTuple);
}
private boolean isNullNode(final Node valueNode) {
return Tag.NULL.equals(valueNode.getTag());
}
+ private boolean isEmptyMappingNode(final Node valueNode) {
+ return Tag.MAP.equals(valueNode.getTag()) && ((MappingNode) valueNode).getValue().isEmpty();
+ }
+
private NodeTuple processNoneTuple(final NodeTuple noneTuple) {
return new NodeTuple(noneTuple.getKeyNode(), new ScalarNode(Tag.STR, "", null, null, DumperOptions.ScalarStyle.PLAIN));
}
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
index b592c1cb7f8..44b346d58ed 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.yaml.engine.constructor.ShardingSphereYam
import org.apache.shardingsphere.infra.yaml.engine.representer.ShardingSphereYamlRepresenter;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;
import java.io.ByteArrayInputStream;
@@ -106,10 +107,25 @@ public final class YamlEngine {
* @return YAML content
*/
public static String marshal(final Object value) {
+ return marshal(value, null);
+ }
+
+ /**
+ * Marshal YAML.
+ *
+ * @param value object to be marshaled
+ * @param classTag class tag
+ * @return YAML content
+ */
+ public static String marshal(final Object value, final Tag classTag) {
DumperOptions dumperOptions = new DumperOptions();
dumperOptions.setLineBreak(DumperOptions.LineBreak.getPlatformLineBreak());
+ ShardingSphereYamlRepresenter shardingSphereYamlRepresenter = new ShardingSphereYamlRepresenter();
+ if (classTag != null) {
+ shardingSphereYamlRepresenter.addClassTag(value.getClass(), classTag);
+ }
if (value instanceof Collection) {
- return new Yaml(new ShardingSphereYamlRepresenter(), dumperOptions).dumpAs(value, null, DumperOptions.FlowStyle.BLOCK);
+ return new Yaml(shardingSphereYamlRepresenter, dumperOptions).dumpAs(value, null, DumperOptions.FlowStyle.BLOCK);
}
return new Yaml(new ShardingSphereYamlRepresenter(), dumperOptions).dumpAsMap(value);
}
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
index 6aa5f8a3b29..fd2a9e078a1 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
@@ -56,6 +56,7 @@ public final class DefaultYamlTupleProcessor {
}
private boolean isEmptyMappingNode(final Node valueNode) {
- return Tag.MAP.equals(valueNode.getTag()) && ((MappingNode) valueNode).getValue().isEmpty();
+ return Tag.MAP.equals(valueNode.getTag()) && (((MappingNode) valueNode).getValue().isEmpty()
+ || ((MappingNode) valueNode).getValue().stream().filter(each -> Tag.NULL.equals(each.getValueNode().getTag())).findFirst().isPresent());
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
index 8d2254e5969..2b1717db9c8 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
@@ -33,6 +33,7 @@ import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
import org.apache.shardingsphere.proxy.backend.text.distsql.ral.QueryableRALBackendHandler;
+import org.yaml.snakeyaml.nodes.Tag;
import javax.sql.DataSource;
import java.io.File;
@@ -111,10 +112,15 @@ public final class ExportDatabaseConfigurationHandler extends QueryableRALBacken
}
stringBuilder.append("rules").append(":\n");
for (Entry<RuleConfiguration, YamlRuleConfigurationSwapper> entry : YamlRuleConfigurationSwapperFactory.getInstanceMapByRuleConfigurations(ruleConfigs).entrySet()) {
- stringBuilder.append(YamlEngine.marshal(Collections.singleton(entry.getValue().swapToYamlConfiguration(entry.getKey()))));
+ String actual = YamlEngine.marshal(Collections.singleton(entry.getValue().swapToYamlConfiguration(entry.getKey())), Tag.MAP);
+ stringBuilder.append(rulesConfigKeywordReplace(actual));
}
}
+ private String rulesConfigKeywordReplace(final String rulesConfig) {
+ return rulesConfig.replace("? ", "- ").replace(": null\n", "");
+ }
+
@SuppressWarnings("ResultOfMethodCallIgnored")
private void exportToFile(final String filePath, final String exportedData) {
File file = new File(filePath);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
index 1a25aa4550b..4eaa70dc6e3 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
@@ -30,19 +30,14 @@ dataSources:
minPoolSize: 1
maxPoolSize: 50
rules:
-!!set
-? !SHARDING
+- !SHARDING
defaultDatabaseStrategy:
standard:
shardingAlgorithmName: ds_inline
shardingColumn: order_id
- defaultTableStrategy:
- none: ''
keyGenerators:
snowflake:
type: SNOWFLAKE
- scaling:
- default_scaling: null
scalingName: default_scaling
shardingAlgorithms:
ds_inline:
@@ -56,4 +51,3 @@ rules:
column: order_id
keyGeneratorName: snowflake
logicTable: t_order
-: null