This is an automated email from the ASF dual-hosted git repository.
apolovtsev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new d80ffb6dc2 IGNITE-23482 Widen types in Configuration API (#4585)
d80ffb6dc2 is described below
commit d80ffb6dc21fb099049a125ef063297508ea7ca1
Author: Alexander Polovtcev <[email protected]>
AuthorDate: Thu Oct 17 17:19:10 2024 +0300
IGNITE-23482 Widen types in Configuration API (#4585)
---
.../configuration/ConfigurationConverter.java | 12 ++++---
.../configuration/hocon/HoconConverter.java | 14 ++++----
.../configuration/util/ConfigurationUtil.java | 41 ++++++++--------------
3 files changed, 28 insertions(+), 39 deletions(-)
diff --git
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationConverter.java
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationConverter.java
index 5de9cf07ec..3d3a749c97 100644
---
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationConverter.java
+++
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationConverter.java
@@ -24,6 +24,7 @@ import
org.apache.ignite.internal.configuration.tree.TraversableTreeNode;
import org.apache.ignite.internal.configuration.util.ConfigurationUtil;
import org.apache.ignite.internal.configuration.util.KeyNotFoundException;
import org.apache.ignite.internal.configuration.util.NodeValue;
+import org.jetbrains.annotations.Nullable;
/**
* Converter of configuration subtree into a user-defined representation.
@@ -35,17 +36,18 @@ public final class ConfigurationConverter {
/**
* Converts configuration subtree into a user-defined representation.
*
- * @param superRoot Super root of the configuration.
- * @param path Path to configuration subtree. Can be empty, can't be
{@code null}.
+ * @param root Root of a configuration subtree.
+ * @param path Path to configuration subtree. Can be empty, can't be
{@code null}.
* @param visitor Visitor that will be applied to the subtree and build
the representation.
- * @param <T> Type of the representation.
+ * @param <T> Type of the representation.
* @return User-defined representation constructed by {@code visitor}.
* @throws IllegalArgumentException If {@code path} is not found in
current configuration.
*/
- public static <T> T convert(SuperRoot superRoot, List<String> path,
ConfigurationVisitor<T> visitor) throws IllegalArgumentException {
+ public static <T> @Nullable T convert(TraversableTreeNode root,
List<String> path, ConfigurationVisitor<T> visitor)
+ throws IllegalArgumentException {
NodeValue<?> node;
try {
- node = ConfigurationUtil.find(path, superRoot, false);
+ node = ConfigurationUtil.find(path, root, false);
} catch (KeyNotFoundException e) {
throw new IllegalArgumentException(e.getMessage());
}
diff --git
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/hocon/HoconConverter.java
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/hocon/HoconConverter.java
index 76dfa41098..988844010b 100644
---
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/hocon/HoconConverter.java
+++
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/hocon/HoconConverter.java
@@ -22,10 +22,10 @@ import com.typesafe.config.ConfigValue;
import com.typesafe.config.impl.ConfigImpl;
import java.util.List;
import org.apache.ignite.internal.configuration.ConfigurationConverter;
-import org.apache.ignite.internal.configuration.SuperRoot;
import org.apache.ignite.internal.configuration.tree.ConfigurationSource;
import org.apache.ignite.internal.configuration.tree.ConfigurationVisitor;
import org.apache.ignite.internal.configuration.tree.ConverterToMapVisitor;
+import org.apache.ignite.internal.configuration.tree.TraversableTreeNode;
/**
* Hocon converter.
@@ -34,37 +34,37 @@ public class HoconConverter {
/**
* Converts configuration subtree to a HOCON {@link ConfigValue} instance.
*
- * @param superRoot Super root instance.
+ * @param root Root of a configuration subtree.
* @param path Path to the configuration subtree. Can be empty, can't be
{@code null}.
* @return {@link ConfigValue} instance that represents configuration
subtree.
* @throws IllegalArgumentException If {@code path} is not found in
current configuration.
*/
public static ConfigValue represent(
- SuperRoot superRoot,
+ TraversableTreeNode root,
List<String> path
) {
ConverterToMapVisitor visitor = ConverterToMapVisitor.builder()
.includeInternal(false)
.maskSecretValues(true)
.build();
- return represent(superRoot, path, visitor);
+ return represent(root, path, visitor);
}
/**
* Converts configuration subtree to a HOCON {@link ConfigValue} instance.
*
- * @param superRoot Super root instance.
+ * @param root Root of a configuration subtree.
* @param path Path to the configuration subtree. Can be empty, can't be
{@code null}.
* @param visitor Visitor that will be used to convert configuration
subtree.
* @return {@link ConfigValue} instance that represents configuration
subtree.
* @throws IllegalArgumentException If {@code path} is not found in
current configuration.
*/
public static ConfigValue represent(
- SuperRoot superRoot,
+ TraversableTreeNode root,
List<String> path,
ConfigurationVisitor<?> visitor
) {
- Object res = ConfigurationConverter.convert(superRoot, path, visitor);
+ Object res = ConfigurationConverter.convert(root, path, visitor);
return ConfigImpl.fromAnyRef(res, null);
}
diff --git
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
index 7c2525f770..7ff2b2eae5 100644
---
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
+++
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
@@ -44,6 +44,7 @@ import java.util.RandomAccess;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
+import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.apache.ignite.configuration.ConfigurationProperty;
import
org.apache.ignite.configuration.ConfigurationWrongPolymorphicTypeIdException;
@@ -77,15 +78,21 @@ import org.jetbrains.annotations.Nullable;
* Utility class for configuration.
*/
public class ConfigurationUtil {
- /** Configuration source that copies values without modifying tham. */
+ /** Configuration source that copies values without modifying them. */
public static final ConfigurationSource EMPTY_CFG_SRC = new
ConfigurationSource() {
};
/**
- * Seperator string for both public and internal representations of
configuration keys.
+ * Separator string for both public and internal representations of
configuration keys.
*/
public static final String KEY_SEPARATOR = ".";
+ private static final Pattern ESCAPE_PATTERN = Pattern.compile("([.\\\\])");
+
+ private static final Pattern UNESCAPE_PATTERN =
Pattern.compile("\\\\([.\\\\])");
+
+ private static final Pattern SPLIT_PATTERN =
Pattern.compile("(?<!\\\\)[.]");
+
/**
* Replaces all {@code .} and {@code \} characters with {@code \.} and
{@code \\} respectively.
*
@@ -93,7 +100,7 @@ public class ConfigurationUtil {
* @return Escaped string.
*/
public static String escape(String key) {
- return key.replaceAll("([.\\\\])", "\\\\$1");
+ return ESCAPE_PATTERN.matcher(key).replaceAll("\\\\$1");
}
/**
@@ -103,7 +110,7 @@ public class ConfigurationUtil {
* @return Unescaped string.
*/
public static String unescape(String key) {
- return key.replaceAll("\\\\([.\\\\])", "$1");
+ return UNESCAPE_PATTERN.matcher(key).replaceAll("$1");
}
/**
@@ -116,7 +123,7 @@ public class ConfigurationUtil {
* @see #KEY_SEPARATOR
*/
public static List<String> split(String keys) {
- String[] split = keys.split("(?<!\\\\)[.]", -1);
+ String[] split = SPLIT_PATTERN.split(keys, -1);
for (int i = 0; i < split.length; i++) {
split[i] = unescape(split[i]);
@@ -159,17 +166,15 @@ public class ConfigurationUtil {
/** Current index of the key in the {@code keys}. */
private int idx;
- /** {@inheritDoc} */
@Override
public NodeValue<T> visitLeafNode(Field field, String key,
Serializable val) {
if (idx != keys.size()) {
throw new KeyNotFoundException("Configuration value '" +
join(keys.subList(0, idx)) + "' is a leaf");
} else {
- return new NodeValue(field, val);
+ return new NodeValue<>(field, (T) val);
}
}
- /** {@inheritDoc} */
@Override
public NodeValue<T> visitInnerNode(Field field, String key,
InnerNode node) {
if (idx == keys.size()) {
@@ -192,7 +197,6 @@ public class ConfigurationUtil {
}
}
- /** {@inheritDoc} */
@Override
public NodeValue<T> visitNamedListNode(Field field, String key,
NamedListNode<?> node) {
if (idx == keys.size()) {
@@ -269,7 +273,7 @@ public class ConfigurationUtil {
* @param node Node to fill. Not necessarily empty.
* @param prefixMap Map of {@link Serializable} values or other prefix
maps (recursive structure). Every key is unescaped.
* @throws UnsupportedOperationException if prefix map structure doesn't
correspond to actual tree structure. This will be fixed when
- * method is actually used in
configuration storage intergration.
+ * method is actually used in
configuration storage integration.
*/
public static void fillFromPrefixMap(InnerNode node, Map<String, ?>
prefixMap) {
new InnerConfigurationSource(prefixMap).descend(node);
@@ -302,7 +306,6 @@ public class ConfigurationUtil {
*/
public static void addDefaults(InnerNode node) {
node.traverseChildren(new ConfigurationVisitor<>() {
- /** {@inheritDoc} */
@Override
public Object visitLeafNode(Field field, String key, Serializable
val) {
// If source value is null then initialise the same value on
the destination node.
@@ -313,7 +316,6 @@ public class ConfigurationUtil {
return null;
}
- /** {@inheritDoc} */
@Override
public Object visitInnerNode(Field field, String key, InnerNode
innerNode) {
// Copy or create the element.
@@ -326,7 +328,6 @@ public class ConfigurationUtil {
return null;
}
- /** {@inheritDoc} */
@Override
public Object visitNamedListNode(Field field, String key,
NamedListNode<?> namedList) {
// Copy or create the element.
@@ -414,7 +415,6 @@ public class ConfigurationUtil {
*/
public static ConfigurationVisitor<NamedListNode<?>>
namedListNodeVisitor() {
return new ConfigurationVisitor<>() {
- /** {@inheritDoc} */
@Override
public NamedListNode<?> visitNamedListNode(Field field, String
key, NamedListNode<?> node) {
return node;
@@ -793,7 +793,6 @@ public class ConfigurationUtil {
/** Current index of the key in the {@code path}. */
private int idx;
- /** {@inheritDoc} */
@Override
public T visitLeafNode(Field field, String key, Serializable
val) {
if (idx != pathSize) {
@@ -803,7 +802,6 @@ public class ConfigurationUtil {
}
}
- /** {@inheritDoc} */
@Override
public T visitInnerNode(Field field, String key, InnerNode
node) {
if (node == null) {
@@ -837,7 +835,6 @@ public class ConfigurationUtil {
}
}
- /** {@inheritDoc} */
@Override
public T visitNamedListNode(Field field, String key,
NamedListNode<?> node) {
if (idx == pathSize) {
@@ -957,7 +954,6 @@ public class ConfigurationUtil {
this.val = val;
}
- /** {@inheritDoc} */
@Override
public <T> T unwrap(Class<T> clazz) {
assert val == null || clazz.isInstance(val);
@@ -965,7 +961,6 @@ public class ConfigurationUtil {
return clazz.cast(val);
}
- /** {@inheritDoc} */
@Override
public void descend(ConstructableTreeNode node) {
throw new UnsupportedOperationException("descend");
@@ -988,13 +983,6 @@ public class ConfigurationUtil {
this.map = map;
}
- /** {@inheritDoc} */
- @Override
- public <T> T unwrap(Class<T> clazz) {
- throw new UnsupportedOperationException("unwrap");
- }
-
- /** {@inheritDoc} */
@Override
public void descend(ConstructableTreeNode node) {
if (node instanceof NamedListNode) {
@@ -1024,7 +1012,6 @@ public class ConfigurationUtil {
}
}
- /** {@inheritDoc} */
@Override
public @Nullable String polymorphicTypeId(String fieldName) {
return (String) map.get(fieldName);