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

Reply via email to