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