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