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

tkalkirill 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 5f9957f80a IGNITE-17689 Add UUID support for 
org.apache.ignite.configuration.annotation.Value (#1082)
5f9957f80a is described below

commit 5f9957f80a5ee3306a87f64c231aa45016d50704
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Thu Sep 15 20:41:38 2022 +0300

    IGNITE-17689 Add UUID support for 
org.apache.ignite.configuration.annotation.Value (#1082)
---
 .../processor/TestConfigurationSchema.java         |  7 +++++
 .../processor/ConfigurationProcessor.java          | 34 ++++++++++------------
 .../ignite/configuration/annotation/Value.java     |  2 ++
 .../asm/ConfigurationAsmGeneratorTest.java         | 33 +++++++++++++++++++++
 .../configuration/tree/ConfigurationArrayTest.java | 12 ++++++--
 5 files changed, 68 insertions(+), 20 deletions(-)

diff --git 
a/modules/configuration-annotation-processor/src/integrationTest/resources/org/apache/ignite/internal/configuration/processor/TestConfigurationSchema.java
 
b/modules/configuration-annotation-processor/src/integrationTest/resources/org/apache/ignite/internal/configuration/processor/TestConfigurationSchema.java
index 32c9000f2d..28b75104b7 100644
--- 
a/modules/configuration-annotation-processor/src/integrationTest/resources/org/apache/ignite/internal/configuration/processor/TestConfigurationSchema.java
+++ 
b/modules/configuration-annotation-processor/src/integrationTest/resources/org/apache/ignite/internal/configuration/processor/TestConfigurationSchema.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.configuration.processor;
 
+import java.util.UUID;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.Value;
 
@@ -33,4 +34,10 @@ public class TestConfigurationSchema {
 
     @Value
     public String[] stringArray;
+
+    @Value
+    public UUID uuidValue;
+
+    @Value
+    public UUID[] uuidArray;
 }
diff --git 
a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
 
b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
index f9107e6291..4294fa1b2e 100644
--- 
a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
+++ 
b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
@@ -186,13 +186,15 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
 
                 Value valueAnnotation = field.getAnnotation(Value.class);
                 if (valueAnnotation != null) {
-                    // Must be a primitive or an array of the primitives 
(including java.lang.String)
-                    if (!isPrimitiveOrArray(field.asType())) {
-                        throw new ConfigurationProcessorException(
-                                "@Value " + clazz.getQualifiedName() + "." + 
field.getSimpleName() + " field must"
-                                        + " have one of the following types: 
boolean, int, long, double, String or an array of "
-                                        + "aforementioned type."
-                        );
+                    // Must be a primitive or an array of the primitives 
(including java.lang.String, java.util.UUID).
+                    if (!isValidValueAnnotationFieldType(field.asType())) {
+                        throw new 
ConfigurationProcessorException(String.format(
+                                "%s %s.%s field must have one of the following 
types: "
+                                        + "boolean, int, long, double, String, 
UUID or an array of aforementioned type.",
+                                simpleName(Value.class),
+                                clazz.getQualifiedName(),
+                                field.getSimpleName()
+                        ));
                     }
                 }
 
@@ -460,7 +462,7 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
             TypeMirror schemaFieldType = field.asType();
             TypeName schemaFieldTypeName = TypeName.get(schemaFieldType);
 
-            boolean leafField = isPrimitiveOrArray(schemaFieldType)
+            boolean leafField = 
isValidValueAnnotationFieldType(schemaFieldType)
                     || !((ClassName) 
schemaFieldTypeName).simpleName().contains(CONFIGURATION_SCHEMA_POSTFIX);
 
             boolean namedListField = 
field.getAnnotation(NamedConfigValue.class) != null;
@@ -566,12 +568,13 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
     }
 
     /**
-     * Checks whether the given type is a primitive (or String) or an array of 
primitives (or Strings).
+     * Checks that the type of the field with {@link Value} is valid: 
primitive, {@link String}, or {@link UUID} (or an array of one of
+     * these).
      *
-     * @param type type
-     * @return {@code true} if type is a primitive or a String or an array of 
primitives or Strings
+     * @param type Field type with {@link Value}.
+     * @return {@code True} if the field type is valid.
      */
-    private boolean isPrimitiveOrArray(TypeMirror type) {
+    private boolean isValidValueAnnotationFieldType(TypeMirror type) {
         if (type.getKind() == TypeKind.ARRAY) {
             type = ((ArrayType) type).getComponentType();
         }
@@ -580,12 +583,7 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
             return true;
         }
 
-        TypeMirror stringType = processingEnv
-                .getElementUtils()
-                .getTypeElement(String.class.getCanonicalName())
-                .asType();
-
-        return processingEnv.getTypeUtils().isSameType(type, stringType);
+        return isClass(type, String.class) || isClass(type, UUID.class);
     }
 
     /**
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/annotation/Value.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/annotation/Value.java
index ddaa6651df..a2b707de23 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/annotation/Value.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/annotation/Value.java
@@ -23,6 +23,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
+import java.util.UUID;
 
 /**
  * This annotation marks configuration schema field as a configuration tree 
leaf. Every field annotated with this annotation will produce a
@@ -35,6 +36,7 @@ import java.lang.annotation.Target;
  *     <li>long</li>
  *     <li>double</li>
  *     <li>String</li>
+ *     <li>{@link UUID}</li>
  * </ul>
  */
 @Target(FIELD)
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGeneratorTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGeneratorTest.java
index 8c7a9a5e68..ea68b0f225 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGeneratorTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGeneratorTest.java
@@ -646,6 +646,31 @@ public class ConfigurationAsmGeneratorTest {
         
assertTrue(rootFromAbstractConfig.configFromAbstract().booleanVal().value());
     }
 
+    @Test
+    void testUuidValueAnnotationField() throws Exception {
+        TestRootConfiguration rootConfig = (TestRootConfiguration) 
generator.instantiateCfg(TestRootConfiguration.KEY, changer);
+
+        UUID uuid0 = rootConfig.uuid0().value();
+
+        assertNotNull(uuid0);
+
+        UUID newUuid0 = UUID.randomUUID();
+
+        rootConfig.uuid0().update(newUuid0).get(1, SECONDS);
+
+        assertEquals(newUuid0, rootConfig.uuid0().value());
+
+        UUID uuid1 = rootConfig.subCfg().uuid1().value();
+
+        assertNotNull(uuid1);
+
+        UUID newUuid1 = UUID.randomUUID();
+
+        rootConfig.subCfg().uuid1().update(newUuid1).get(1, SECONDS);
+
+        assertEquals(newUuid1, rootConfig.subCfg().uuid1().value());
+    }
+
     /**
      * Test root configuration schema.
      */
@@ -659,6 +684,10 @@ public class ConfigurationAsmGeneratorTest {
         @Value(hasDefault = true)
         public String str0 = "str0";
 
+        /** UUID field. */
+        @Value(hasDefault = true)
+        public UUID uuid0 = UUID.randomUUID();
+
         /** Sub configuration field. */
         @ConfigValue
         public TestConfigurationSchema subCfg;
@@ -708,6 +737,10 @@ public class ConfigurationAsmGeneratorTest {
         /** String field. */
         @Value(hasDefault = true)
         public String str2 = "str2";
+
+        /** UUID field. */
+        @Value(hasDefault = true)
+        public UUID uuid1 = UUID.randomUUID();
     }
 
     /**
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/tree/ConfigurationArrayTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/tree/ConfigurationArrayTest.java
index b05e91bb96..5cf42ff80a 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/tree/ConfigurationArrayTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/tree/ConfigurationArrayTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
 /**
- * Test configuration with array of primitives and {@code String} fields.
+ * Test configuration with array of primitives, {@link String} and {@link 
UUID} fields.
  */
 public class ConfigurationArrayTest {
     /**
@@ -70,6 +70,9 @@ public class ConfigurationArrayTest {
 
         @Value
         public String[] stringArray;
+
+        @Value
+        public UUID[] uuidArray;
     }
 
     private static ConfigurationAsmGenerator cgen = new 
ConfigurationAsmGenerator();
@@ -97,7 +100,8 @@ public class ConfigurationArrayTest {
                 char[].class,
                 float[].class,
                 double[].class,
-                String[].class
+                String[].class,
+                UUID[].class
         );
     }
 
@@ -181,6 +185,8 @@ public class ConfigurationArrayTest {
             return "doubleArray";
         } else if (cls == String[].class) {
             return "stringArray";
+        } else if (cls == UUID[].class) {
+            return "uuidArray";
         } else {
             throw new AssertionError("Invalid field type: " + cls);
         }
@@ -210,6 +216,8 @@ public class ConfigurationArrayTest {
             return new double[]{random.nextDouble(), random.nextDouble(), 
random.nextDouble()};
         } else if (cls == String[].class) {
             return new String[]{UUID.randomUUID().toString(), 
UUID.randomUUID().toString(), UUID.randomUUID().toString()};
+        } else if (cls == UUID[].class) {
+            return new UUID[]{UUID.randomUUID(), UUID.randomUUID(), 
UUID.randomUUID()};
         } else {
             throw new AssertionError("Invalid field type: " + cls);
         }

Reply via email to