GUACAMOLE-374: Allow multiple PropertyValue annotations to be associated with each enum value for EnumGuacamoleProperty.

This commit is contained in:
Michael Jumper
2024-04-22 15:40:34 -07:00
parent c818650ae0
commit acaee44a53
2 changed files with 41 additions and 3 deletions

View File

@@ -20,6 +20,7 @@
package org.apache.guacamole.properties;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@@ -45,8 +46,10 @@ public abstract class EnumGuacamoleProperty<T extends Enum<T>> implements Guacam
/**
* Defines the string value which should be accepted and parsed into the
* annotated enum constant.
* annotated enum constant. This annotation is repeatable, and each enum
* constant may be associated with any any number of string values.
*/
@Repeatable(PropertyValues.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public static @interface PropertyValue {
@@ -63,6 +66,29 @@ public abstract class EnumGuacamoleProperty<T extends Enum<T>> implements Guacam
}
/**
* Defines the string values which should be accepted and parsed into the
* annotated enum constant. Each enum constant may be associated with any
* any number of string values.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public static @interface PropertyValues {
/**
* Returns the {@link PropertyValue} annotations that represent the
* String values that should produce the annotated enum constant when
* parsed.
*
* @return
* The {@link PropertyValue} annotations that represent the String
* values that should produce the annotated enum constant when
* parsed.
*/
PropertyValue[] value();
}
/**
* Mapping of valid property values to the corresponding enum constants
* that those values parse to.
@@ -103,7 +129,17 @@ public abstract class EnumGuacamoleProperty<T extends Enum<T>> implements Guacam
+ "match declared values.", e);
}
// Map enum constant only if PropertyValue annotation is present
// Map enum constant only if one or more PropertyValue annotations
// are present
PropertyValues valuesAnnotation = field.getAnnotation(PropertyValues.class);
if (valuesAnnotation != null) {
for (PropertyValue valueAnnotation : valuesAnnotation.value())
valueMapping.put(valueAnnotation.value(), value);
}
// The PropertyValue annotation may appear as a separate, single
// annotation, or as a multi-valued annotation via PropertyValues
// (see above)
PropertyValue valueAnnotation = field.getAnnotation(PropertyValue.class);
if (valueAnnotation != null)
valueMapping.put(valueAnnotation.value(), value);