diff options
author | Dico200 <dico.karssiens@gmail.com> | 2018-07-25 01:53:23 +0100 |
---|---|---|
committer | Dico200 <dico.karssiens@gmail.com> | 2018-07-25 01:53:23 +0100 |
commit | 44587e49ff1840219d9bc44844d4a3a6cd8ac5de (patch) | |
tree | 276ae9625795e9d79fc7db8592dbcb3a1af60928 /dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java | |
parent | 5e168847c2624b767deb9da310ecfdf169e0f43c (diff) |
Add dicore3-command
Diffstat (limited to 'dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java')
-rw-r--r-- | dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java new file mode 100644 index 0000000..dbd7590 --- /dev/null +++ b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/ParameterConfig.java @@ -0,0 +1,80 @@ +package io.dico.dicore.command.parameter.type; + +import io.dico.dicore.Reflection; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; + +/** + * This class serves the purpose of having annotated parameter configurations (such as ranges for number parameters). + * Such configurations must be possible to obtain without using annotations, and as such, there should be a class conveying the information + * that is separate from the annotation itself. This class acts as a bridge from the annotation to said class conveying the information. + * + * @param <TAnnotation> the annotation type for parameters + * @param <TParamInfo> the object type that holds the information required in memory + */ +public abstract class ParameterConfig<TAnnotation extends Annotation, TParamInfo> implements Comparable<ParameterConfig<?, ?>> { + private final Class<TAnnotation> annotationClass; + // protected final TParamInfo defaultValue; + + public ParameterConfig(Class<TAnnotation> annotationClass/*, TParamInfo defaultValue*/) { + this.annotationClass = annotationClass; + //this.defaultValue = defaultValue; + } + + public final Class<TAnnotation> getAnnotationClass() { + return annotationClass; + } + /* + public TParamInfo getDefaultValue() { + return defaultValue; + }*/ + + protected abstract TParamInfo toParameterInfo(TAnnotation annotation); + + public TParamInfo getParameterInfo(Annotation annotation) { + //noinspection unchecked + return toParameterInfo((TAnnotation) annotation); + } + + public static <TAnnotation extends Annotation, TParamInfo> ParameterConfig<TAnnotation, TParamInfo> + includeMemoryClass(Class<TAnnotation> annotationClass, Class<TParamInfo> memoryClass) { + Constructor<TParamInfo> constructor; + //TParamInfo defaultValue; + try { + constructor = memoryClass.getConstructor(annotationClass); + //defaultValue = Reflection.getStaticFieldValue(annotationClass, "DEFAULT"); + } catch (NoSuchMethodException | IllegalArgumentException ex) { + throw new IllegalArgumentException(ex); + } + /* + if (defaultValue == null) try { + defaultValue = memoryClass.newInstance(); + } catch (IllegalAccessException | InstantiationException ex) { + throw new IllegalArgumentException("Failed to get a default value for the param info", ex); + }*/ + + return new ParameterConfig<TAnnotation, TParamInfo>(annotationClass/*, defaultValue*/) { + + @Override + public TParamInfo toParameterInfo(TAnnotation annotation) { + try { + return constructor.newInstance(annotation); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + }; + } + + public static <TAnnotation extends Annotation, TParamInfo> ParameterConfig<TAnnotation, TParamInfo> getMemoryClassFromField(Class<TAnnotation> annotationClass) { + return ParameterConfig.includeMemoryClass(annotationClass, Reflection.getStaticFieldValue(annotationClass, "MEMORY_CLASS")); + } + + @Override + public int compareTo(ParameterConfig<?, ?> o) { + return 0; + } + +} + |