This is an automated email from the ASF dual-hosted git repository.

ibessonov 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 ddacc964a3 IGNITE-24046 Fix findSchemaField in 
ConfigurationValidarorImpl
ddacc964a3 is described below

commit ddacc964a3e6e20894ec52127bc48f2ba1ddd418
Author: Phillippko <[email protected]>
AuthorDate: Thu Dec 19 18:08:43 2024 +0700

    IGNITE-24046 Fix findSchemaField in ConfigurationValidarorImpl
---
 .../asm/ConfigurationAsmGenerator.java             |  4 +-
 .../validation/ConfigurationValidatorImpl.java     | 67 +++++++++++-----------
 .../validation/ConfigurationValidatorImplTest.java | 23 +++++++-
 3 files changed, 58 insertions(+), 36 deletions(-)

diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
index 974d5bbdad..63e113b077 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
@@ -480,11 +480,11 @@ public class ConfigurationAsmGenerator {
     /**
      * Return a user-facing configuration property name. If schema field 
contains {@link PublicName} annotation, this method will return its
      * {@link PublicName#value()}. Otherwise it will return {@link 
Field#getName()}.
-
+     *
      * @param f Configuration schema field.
      * @return User-facing configuration property name.
      */
-    static String publicName(Field f) {
+    public static String publicName(Field f) {
         PublicName annotation = f.getAnnotation(PublicName.class);
 
         return annotation == null ? f.getName() : annotation.value();
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImpl.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImpl.java
index c87c72aa73..d22f3fb444 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImpl.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.configuration.validation;
 
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toMap;
+import static 
org.apache.ignite.internal.configuration.asm.ConfigurationAsmGenerator.publicName;
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.addDefaults;
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.appendKey;
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.dropNulls;
@@ -47,7 +48,6 @@ import 
org.apache.ignite.internal.configuration.tree.ConfigurationSource;
 import org.apache.ignite.internal.configuration.tree.InnerNode;
 import 
org.apache.ignite.internal.configuration.util.AnyNodeConfigurationVisitor;
 import 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor;
-import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -174,24 +174,19 @@ public class ConfigurationValidatorImpl implements 
ConfigurationValidator {
                 MemberKey memberKey = new 
MemberKey(lastInnerNode.schemaType(), fieldName);
 
                 Map<Annotation, Set<Validator<?, ?>>> fieldAnnotations = 
cachedAnnotations.computeIfAbsent(memberKey, k -> {
-                    try {
-                        Field field = findSchemaField(lastInnerNode, 
fieldName);
-
-                        assert field != null : memberKey;
-
-                        return 
Stream.of(field.getDeclaredAnnotations()).collect(toMap(identity(), annotation 
->
-                                validators.stream()
-                                        .filter(validator -> 
validator.canValidate(
-                                                annotation.annotationType(),
-                                                field.getType(),
-                                                
field.isAnnotationPresent(NamedConfigValue.class)
-                                        ))
-                                        .collect(Collectors.toSet()))
-                        );
-                    } catch (Exception e) {
-                        // Should be impossible.
-                        throw new IgniteInternalException(e);
-                    }
+                    Field field = findSchemaField(lastInnerNode, fieldName);
+
+                    assert field != null : "Field " + fieldName + " not found 
for " + lastInnerNode.schemaType().getSimpleName();
+
+                    return 
Stream.of(field.getDeclaredAnnotations()).collect(toMap(identity(), annotation 
->
+                            validators.stream()
+                                    .filter(validator -> validator.canValidate(
+                                            annotation.annotationType(),
+                                            field.getType(),
+                                            
field.isAnnotationPresent(NamedConfigValue.class)
+                                    ))
+                                    .collect(Collectors.toSet()))
+                    );
                 });
 
                 if (fieldAnnotations.isEmpty()) {
@@ -223,31 +218,39 @@ public class ConfigurationValidatorImpl implements 
ConfigurationValidator {
         return issues;
     }
 
-    private @Nullable Field findSchemaField(InnerNode innerNode, String 
schemaFieldName) throws NoSuchFieldException {
+    private static @Nullable Field findSchemaField(InnerNode innerNode, String 
publicName) {
         Class<?> schemaType = innerNode.schemaType();
 
         if (innerNode.isPolymorphic() || 
innerNode.extendsAbstractConfiguration()) {
-            // Linear search to not fight with NoSuchFieldException.
-            for (Field field : schemaType.getDeclaredFields()) {
-                if (field.getName().equals(schemaFieldName)) {
-                    return field;
-                }
+            Field field = findSchemaField(schemaType, publicName);
+
+            if (field != null) {
+                return field;
             }
 
-            // Get parent schema.
+            // Check parent schema.
             schemaType = schemaType.getSuperclass();
         } else if (innerNode.extensionSchemaTypes() != null) {
-            // Linear search to not fight with NoSuchFieldException.
             for (Class<?> extensionSchemaType : 
innerNode.extensionSchemaTypes()) {
-                for (Field field : extensionSchemaType.getDeclaredFields()) {
-                    if (field.getName().equals(schemaFieldName)) {
-                        return field;
-                    }
+                Field field = findSchemaField(extensionSchemaType, publicName);
+
+                if (field != null) {
+                    return field;
                 }
             }
         }
 
-        return schemaType.getDeclaredField(schemaFieldName);
+        return findSchemaField(schemaType, publicName);
+    }
+
+    private static @Nullable Field findSchemaField(Class<?> schemaType, String 
publicName) {
+        for (Field field : schemaType.getDeclaredFields()) {
+            if (publicName(field).equals(publicName)) {
+                return field;
+            }
+        }
+
+        return null;
     }
 
     private SuperRoot emptySuperRoot() {
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImplTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImplTest.java
index 1794ce34d0..07b5c313b8 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImplTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/ConfigurationValidatorImplTest.java
@@ -41,6 +41,7 @@ import 
org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.PolymorphicConfig;
 import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance;
 import org.apache.ignite.configuration.annotation.PolymorphicId;
+import org.apache.ignite.configuration.annotation.PublicName;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
@@ -134,6 +135,11 @@ public class ConfigurationValidatorImplTest extends 
BaseIgniteAbstractTest {
         @LeafValidation
         @Value(hasDefault = true)
         public String str = "foo";
+
+        @LeafValidation
+        @Value(hasDefault = true)
+        @PublicName("strChangedName")
+        public String strPublicName = "foo";
     }
 
     /**
@@ -144,6 +150,11 @@ public class ConfigurationValidatorImplTest extends 
BaseIgniteAbstractTest {
         @LeafValidation
         @Value(hasDefault = true)
         public String strInternal = "fooInternal";
+
+        @LeafValidation
+        @Value(hasDefault = true)
+        @PublicName("strInternalChangedName")
+        public String strInternalPublicName = "fooInternal";
     }
 
     /**
@@ -166,6 +177,11 @@ public class ConfigurationValidatorImplTest extends 
BaseIgniteAbstractTest {
         @LeafValidation
         @Value(hasDefault = true)
         public String strPoly = "fooPolyFirst";
+
+        @LeafValidation
+        @Value(hasDefault = true)
+        @PublicName("strPolyChangedName")
+        public String strPolyPublicName = "fooPolyFirst";
     }
 
     private InnerNode root;
@@ -196,9 +212,12 @@ public class ConfigurationValidatorImplTest extends 
BaseIgniteAbstractTest {
 
         List<ValidationIssue> expected = List.of(
                 new ExValidationIssue("bar", "root.child.str", "foo", "foo"),
+                new ExValidationIssue("bar", "root.child.strChangedName", 
"foo", "foo"),
                 new ExValidationIssue("bar", "root.child.strInternal", 
"fooInternal", "fooInternal"),
+                new ExValidationIssue("bar", 
"root.child.strInternalChangedName", "fooInternal", "fooInternal"),
                 new ExValidationIssue("bar", "root.poly.type", 
DEFAULT_POLY_TYPE, DEFAULT_POLY_TYPE),
-                new ExValidationIssue("bar", "root.poly.strPoly", 
"fooPolyFirst", "fooPolyFirst")
+                new ExValidationIssue("bar", "root.poly.strPoly", 
"fooPolyFirst", "fooPolyFirst"),
+                new ExValidationIssue("bar", "root.poly.strPolyChangedName", 
"fooPolyFirst", "fooPolyFirst")
         );
 
         assertThat(
@@ -396,7 +415,7 @@ public class ConfigurationValidatorImplTest extends 
BaseIgniteAbstractTest {
         /** {@inheritDoc} */
         @Override
         public String toString() {
-            return S.toString(ExValidationIssue.class, this, message());
+            return S.toString(ExValidationIssue.class, this, super.toString());
         }
 
         static int compareByCurrentKey(ValidationIssue o1, ValidationIssue o2) 
{

Reply via email to