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 2021/02/20 08:26:27 UTC
[shardingsphere] branch master updated: Unify unmarshal and
secureUnmarshal in YamlEngine (#9453)
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 5d1ff85 Unify unmarshal and secureUnmarshal in YamlEngine (#9453)
5d1ff85 is described below
commit 5d1ff85f5696ab61ff8a69aae3ff7cb3aae2cf67
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Sat Feb 20 16:26:03 2021 +0800
Unify unmarshal and secureUnmarshal in YamlEngine (#9453)
---
.../src/test/resources/yaml/sharding-rule.yaml | 36 +++++++++-------
.../listener/AuthenticationChangedListener.java | 6 +--
.../config/listener/PropertiesChangedListener.java | 2 +-
.../metadata/DataSourceChangedListener.java | 2 +-
.../listener/metadata/RuleChangedListener.java | 2 +-
.../yaml/config/YamlConfigurationConverter.java | 6 +--
.../infra/yaml/engine/YamlEngine.java | 28 -------------
.../ShardingSphereFilterYamlConstructor.java | 48 ----------------------
.../constructor/ShardingSphereYamlConstructor.java | 11 +++++
.../config/YamlEngineUserConfigurationTest.java | 2 +-
.../infra/yaml/engine/YamlEngineTest.java | 37 ++---------------
11 files changed, 45 insertions(+), 135 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/resources/yaml/sharding-rule.yaml b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/resources/yaml/sharding-rule.yaml
index 5a7cba1..ad305b4 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/resources/yaml/sharding-rule.yaml
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/test/resources/yaml/sharding-rule.yaml
@@ -16,21 +16,27 @@
#
dataSources:
- ds_0: !!com.zaxxer.hikari.HikariDataSource
- driverClassName: org.h2.Driver
- jdbcUrl: jdbc:h2:mem:primary_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
- username: sa
- password:
- ds_1: !!com.zaxxer.hikari.HikariDataSource
- driverClassName: org.h2.Driver
- jdbcUrl: jdbc:h2:mem:primary_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
- username: sa
- password:
- default_ds: !!com.zaxxer.hikari.HikariDataSource
- driverClassName: org.h2.Driver
- jdbcUrl: jdbc:h2:mem:default_ds;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
- username: sa
- password:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ props:
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:primary_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
+ username: sa
+ password:
+ ds_1:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ props:
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:primary_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
+ username: sa
+ password:
+ default_ds:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ props:
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:default_ds;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
+ username: sa
+ password:
rules:
- !SHARDING
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/AuthenticationChangedListener.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/AuthenticationChangedListener.java
index 12bdd83..05b3060 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/AuthenticationChangedListener.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/AuthenticationChangedListener.java
@@ -21,11 +21,9 @@ import org.apache.shardingsphere.governance.core.config.ConfigCenterNode;
import org.apache.shardingsphere.governance.core.event.listener.PostGovernanceRepositoryEventListener;
import org.apache.shardingsphere.governance.core.event.model.GovernanceEvent;
import org.apache.shardingsphere.governance.core.event.model.auth.UserRuleChangedEvent;
+import org.apache.shardingsphere.governance.core.yaml.config.YamlConfigurationConverter;
import org.apache.shardingsphere.governance.repository.api.ConfigurationRepository;
import org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
-import org.apache.shardingsphere.infra.metadata.auth.builtin.yaml.config.YamlUserRuleConfiguration;
-import org.apache.shardingsphere.infra.metadata.auth.builtin.yaml.swapper.UserRuleYamlSwapper;
-import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
import java.util.Collections;
import java.util.Optional;
@@ -41,6 +39,6 @@ public final class AuthenticationChangedListener extends PostGovernanceRepositor
@Override
protected Optional<GovernanceEvent> createEvent(final DataChangedEvent event) {
- return Optional.of(new UserRuleChangedEvent(new UserRuleYamlSwapper().swapToObject(YamlEngine.unmarshal(event.getValue(), YamlUserRuleConfiguration.class))));
+ return Optional.of(new UserRuleChangedEvent(YamlConfigurationConverter.convertUserRule(event.getValue())));
}
}
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/PropertiesChangedListener.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/PropertiesChangedListener.java
index 01482b3..7b1871d 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/PropertiesChangedListener.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/PropertiesChangedListener.java
@@ -40,6 +40,6 @@ public final class PropertiesChangedListener extends PostGovernanceRepositoryEve
@Override
protected Optional<GovernanceEvent> createEvent(final DataChangedEvent event) {
- return Optional.of(new PropertiesChangedEvent(YamlEngine.secureUnmarshal(event.getValue(), Properties.class)));
+ return Optional.of(new PropertiesChangedEvent(YamlEngine.unmarshal(event.getValue(), Properties.class)));
}
}
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/DataSourceChangedListener.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/DataSourceChangedListener.java
index 58d9a1d..867229c 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/DataSourceChangedListener.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/DataSourceChangedListener.java
@@ -62,7 +62,7 @@ public final class DataSourceChangedListener extends PostGovernanceRepositoryEve
}
private DataSourceChangedEvent createDataSourceChangedEvent(final String schemaName, final DataChangedEvent event) {
- YamlDataSourceConfigurationWrap result = YamlEngine.secureUnmarshal(event.getValue(), YamlDataSourceConfigurationWrap.class);
+ YamlDataSourceConfigurationWrap result = YamlEngine.unmarshal(event.getValue(), YamlDataSourceConfigurationWrap.class);
Preconditions.checkState(null != result && !result.getDataSources().isEmpty(), "No available data sources to load for governance.");
return new DataSourceChangedEvent(schemaName, result.getDataSources().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry -> new YamlDataSourceConfigurationSwapper().swapToObject(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)));
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/RuleChangedListener.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/RuleChangedListener.java
index 568ec6b..7f623a8 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/RuleChangedListener.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/listener/metadata/RuleChangedListener.java
@@ -76,7 +76,7 @@ public final class RuleChangedListener extends PostGovernanceRepositoryEventList
}
private Collection<RuleConfiguration> getRuleConfigurations(final String yamlContent) {
- Collection<YamlRuleConfiguration> rules = YamlEngine.secureUnmarshal(yamlContent, YamlRuleConfigurationWrap.class).getRules();
+ Collection<YamlRuleConfiguration> rules = YamlEngine.unmarshal(yamlContent, YamlRuleConfigurationWrap.class).getRules();
Preconditions.checkState(!rules.isEmpty(), "No available rule to load for governance.");
return new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(rules);
}
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/yaml/config/YamlConfigurationConverter.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/yaml/config/YamlConfigurationConverter.java
index 4ddae40..c306479 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/yaml/config/YamlConfigurationConverter.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/yaml/config/YamlConfigurationConverter.java
@@ -57,7 +57,7 @@ public final class YamlConfigurationConverter {
* @return data source configurations
*/
public static Map<String, DataSourceConfiguration> convertDataSourceConfigurations(final String yamlContent) {
- YamlDataSourceConfigurationWrap result = YamlEngine.secureUnmarshal(yamlContent, YamlDataSourceConfigurationWrap.class);
+ YamlDataSourceConfigurationWrap result = YamlEngine.unmarshal(yamlContent, YamlDataSourceConfigurationWrap.class);
if (null == result.getDataSources() || result.getDataSources().isEmpty()) {
return new LinkedHashMap<>();
}
@@ -106,7 +106,7 @@ public final class YamlConfigurationConverter {
* @return rule configurations
*/
public static Collection<RuleConfiguration> convertRuleConfigurations(final String yamlContent) {
- return new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.secureUnmarshal(yamlContent, YamlRuleConfigurationWrap.class).getRules());
+ return new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(yamlContent, YamlRuleConfigurationWrap.class).getRules());
}
/**
@@ -126,6 +126,6 @@ public final class YamlConfigurationConverter {
* @return properties
*/
public static Properties convertProperties(final String yamlContent) {
- return YamlEngine.secureUnmarshal(yamlContent, Properties.class);
+ return YamlEngine.unmarshal(yamlContent, Properties.class);
}
}
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 3176d2e..e408bb7 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
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.infra.yaml.engine;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.yaml.config.YamlConfiguration;
-import org.apache.shardingsphere.infra.yaml.engine.constructor.ShardingSphereFilterYamlConstructor;
import org.apache.shardingsphere.infra.yaml.engine.constructor.ShardingSphereYamlConstructor;
import org.apache.shardingsphere.infra.yaml.engine.representer.ShardingSphereYamlRepresenter;
import org.yaml.snakeyaml.Yaml;
@@ -31,8 +30,6 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.util.Collection;
-import java.util.Collections;
/**
* YAML engine.
@@ -86,31 +83,6 @@ public final class YamlEngine {
}
/**
- * Secure unmarshal YAML.
- *
- * @param yamlContent YAML content
- * @param classType class type
- * @param acceptedClasses accepted classes
- * @param <T> type of class
- * @return object from YAML
- */
- public static <T> T secureUnmarshal(final String yamlContent, final Class<T> classType, final Collection<Class<?>> acceptedClasses) {
- return new Yaml(new ShardingSphereFilterYamlConstructor(classType, acceptedClasses)).loadAs(yamlContent, classType);
- }
-
- /**
- * Secure unmarshal YAML.
- *
- * @param yamlContent YAML content
- * @param acceptedClass accepted class
- * @param <T> type of class
- * @return object from YAML
- */
- public static <T> T secureUnmarshal(final String yamlContent, final Class<T> acceptedClass) {
- return new Yaml(new ShardingSphereFilterYamlConstructor(acceptedClass, Collections.singletonList(acceptedClass))).loadAs(yamlContent, acceptedClass);
- }
-
- /**
* Marshal YAML.
*
* @param value object to be marshaled
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereFilterYamlConstructor.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereFilterYamlConstructor.java
deleted file mode 100644
index 292a602..0000000
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereFilterYamlConstructor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.infra.yaml.engine.constructor;
-
-import java.util.Collection;
-
-/**
- * ShardingSphere filter constructor for YAML.
- */
-public final class ShardingSphereFilterYamlConstructor extends ShardingSphereYamlConstructor {
-
- private final Collection<Class<?>> acceptedClasses;
-
- public ShardingSphereFilterYamlConstructor(final Class<?> rootClass, final Collection<Class<?>> acceptedClasses) {
- super(rootClass);
- this.acceptedClasses = acceptedClasses;
- }
-
- public ShardingSphereFilterYamlConstructor(final Collection<Class<?>> acceptedClasses) {
- super(Object.class);
- this.acceptedClasses = acceptedClasses;
- }
-
- @Override
- protected Class<?> getClassForName(final String className) throws ClassNotFoundException {
- for (Class<?> each : acceptedClasses) {
- if (className.equals(each.getName())) {
- return super.getClassForName(className);
- }
- }
- throw new IllegalArgumentException(String.format("Class is not accepted: %s", className));
- }
-}
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereYamlConstructor.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereYamlConstructor.java
index 1bc32c0..f28058f 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereYamlConstructor.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/constructor/ShardingSphereYamlConstructor.java
@@ -38,14 +38,25 @@ public class ShardingSphereYamlConstructor extends Constructor {
private final Map<Class<?>, Construct> typeConstructs = new HashMap<>();
+ private final Class<?> rootClass;
+
public ShardingSphereYamlConstructor(final Class<?> rootClass) {
super(rootClass);
ShardingSphereServiceLoader.newServiceInstances(ShardingSphereYamlConstruct.class).forEach(each -> typeConstructs.put(each.getType(), each));
YamlRuleConfigurationSwapperEngine.getYamlShortcuts().forEach((key, value) -> addTypeDescription(new TypeDescription(value, key)));
+ this.rootClass = rootClass;
}
@Override
protected final Construct getConstructor(final Node node) {
return typeConstructs.getOrDefault(node.getType(), super.getConstructor(node));
}
+
+ @Override
+ protected Class<?> getClassForName(final String className) throws ClassNotFoundException {
+ if (className.equals(rootClass.getName())) {
+ return super.getClassForName(className);
+ }
+ throw new IllegalArgumentException(String.format("Class is not accepted: %s", className));
+ }
}
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/config/YamlEngineUserConfigurationTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/config/YamlEngineUserConfigurationTest.java
index fdfe10e..0f7d6a1 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/config/YamlEngineUserConfigurationTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/auth/builtin/yaml/config/YamlEngineUserConfigurationTest.java
@@ -36,7 +36,7 @@ public final class YamlEngineUserConfigurationTest {
@Test
public void assertSecureUnmarshalProperties() {
- Properties actual = YamlEngine.secureUnmarshal("password: pwd", Properties.class);
+ Properties actual = YamlEngine.unmarshal("password: pwd", Properties.class);
assertThat(actual.getProperty("password"), is("pwd"));
}
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngineTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngineTest.java
index 86088b6..bfe178b 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngineTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngineTest.java
@@ -27,16 +27,11 @@ import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Collection;
-import java.util.LinkedList;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
public final class YamlEngineTest {
@@ -72,8 +67,8 @@ public final class YamlEngineTest {
}
@Test
- public void assertSecureUnmarshalProperties() {
- Properties actual = YamlEngine.secureUnmarshal("password: pwd", Properties.class);
+ public void assertUnmarshalProperties() {
+ Properties actual = YamlEngine.unmarshal("password: pwd", Properties.class);
assertThat(actual.getProperty("password"), is("pwd"));
}
@@ -84,32 +79,8 @@ public final class YamlEngineTest {
assertThat(YamlEngine.marshal(actual), is("name: test\n"));
}
- @Test
- public void assertSecureUnmarshalWithAcceptedClass() throws IOException {
- URL url = getClass().getClassLoader().getResource("yaml/accepted-class.yaml");
- assertNotNull(url);
- StringBuilder yamlContent = new StringBuilder();
- try (
- FileReader fileReader = new FileReader(url.getFile());
- BufferedReader reader = new BufferedReader(fileReader)) {
- String line;
- while (null != (line = reader.readLine())) {
- yamlContent.append(line).append("\n");
- }
- }
- Collection<Class<?>> acceptedClasses = new LinkedList<>();
- acceptedClasses.add(URLClassLoader.class);
- acceptedClasses.add(URL.class);
- acceptedClasses.add(YamlRootRuleConfigurations.class);
- YamlRootRuleConfigurations actual = YamlEngine.secureUnmarshal(yamlContent.toString(), YamlRootRuleConfigurations.class, acceptedClasses);
- assertThat(actual.getProps().size(), is(2));
- assertThat(actual.getProps().getProperty("normal"), is("normal"));
- assertTrue(actual.getProps().containsKey("url"));
- assertNull(actual.getProps().getProperty("url"));
- }
-
@Test(expected = ConstructorException.class)
- public void assertSecureUnmarshalWithoutAcceptedClass() throws IOException {
+ public void assertUnmarshalInvalidYaml() throws IOException {
URL url = getClass().getClassLoader().getResource("yaml/accepted-class.yaml");
assertNotNull(url);
StringBuilder yamlContent = new StringBuilder();
@@ -121,6 +92,6 @@ public final class YamlEngineTest {
yamlContent.append(line).append("\n");
}
}
- YamlEngine.secureUnmarshal(yamlContent.toString(), YamlRootRuleConfigurations.class);
+ YamlEngine.unmarshal(yamlContent.toString(), YamlRootRuleConfigurations.class);
}
}