Merge pull request #5 from JavaWebStack/feature/annotations · JavaWebStack/validator@e96fe03
@@ -7,6 +7,7 @@
77import org.javawebstack.abstractdata.AbstractNull;
88import org.javawebstack.validator.rule.*;
9910+import java.lang.annotation.Annotation;
1011import java.lang.reflect.Constructor;
1112import java.lang.reflect.Field;
1213import java.lang.reflect.InvocationTargetException;
@@ -19,30 +20,35 @@ public class Validator {
1920private static final Map<String, Constructor<? extends ValidationRule>> validationRules = new HashMap<>();
2021private static final Map<Class<?>, Validator> validators = new HashMap<>();
212223+private static final Map<Class<? extends ValidationRule>, Class<? extends Annotation>> ruleAnnotationClasses = new HashMap<>();
24+2225static {
23-registerRuleType("string", StringRule.class);
24-registerRuleType("boolean", BooleanRule.class);
25-registerRuleType("bool", BooleanRule.class);
26-registerRuleType("enum", EnumRule.class);
27-registerRuleType("required", RequiredRule.class);
28-registerRuleType("req", RequiredRule.class);
29-registerRuleType("ipv4", IPv4AddressRule.class);
30-registerRuleType("ipv6", IPv6AddressRule.class);
31-registerRuleType("int", IntegerRule.class);
32-registerRuleType("integer", IntegerRule.class);
33-registerRuleType("numeric", NumericRule.class);
34-registerRuleType("num", NumericRule.class);
35-registerRuleType("date", DateRule.class);
36-registerRuleType("array", ArrayRule.class);
37-registerRuleType("list", ArrayRule.class);
38-registerRuleType("alpha", AlphaRule.class);
39-registerRuleType("alpha_num", AlphaNumRule.class);
40-registerRuleType("alpha_dash", AlphaDashRule.class);
41-registerRuleType("email", EmailRule.class);
42-registerRuleType("regex", RegexRule.class);
26+registerRuleType("string", StringRule.Validator.class, StringRule.class);
27+registerRuleType("boolean", BooleanRule.Validator.class, BooleanRule.class);
28+registerRuleType("bool", BooleanRule.Validator.class, BooleanRule.class);
29+registerRuleType("enum", EnumRule.Validator.class, EnumRule.class);
30+registerRuleType("required", RequiredRule.Validator.class, RequiredRule.class);
31+registerRuleType("req", RequiredRule.Validator.class, RequiredRule.class);
32+registerRuleType("ipv4", IPv4AddressRule.Validator.class, IPv4AddressRule.class);
33+registerRuleType("ipv6", IPv6AddressRule.Validator.class, IPv6AddressRule.class);
34+registerRuleType("int", IntegerRule.Validator.class, IntegerRule.class);
35+registerRuleType("integer", IntegerRule.Validator.class, IntegerRule.class);
36+registerRuleType("numeric", NumericRule.Validator.class, NumericRule.class);
37+registerRuleType("num", NumericRule.Validator.class, NumericRule.class);
38+registerRuleType("date", DateRule.Validator.class, DateRule.class);
39+registerRuleType("array", ArrayRule.Validator.class, ArrayRule.class);
40+registerRuleType("list", ArrayRule.Validator.class, ArrayRule.class);
41+registerRuleType("alpha", AlphaRule.Validator.class, AlphaRule.class);
42+registerRuleType("alpha_num", AlphaNumRule.Validator.class, AlphaNumRule.class);
43+registerRuleType("alpha_dash", AlphaDashRule.Validator.class, AlphaDashRule.class);
44+registerRuleType("email", EmailRule.Validator.class, EmailRule.class);
45+registerRuleType("regex", RegexRule.Validator.class, RegexRule.class);
46+registerRuleType("uuid", UUIDRule.Validator.class, UUIDRule.class);
4347 }
444845-public static void registerRuleType(String name, Class<? extends ValidationRule> type) {
49+public static void registerRuleType(String name, Class<? extends ValidationRule> type, Class<? extends Annotation> annotationClass) {
50+if (!ruleAnnotationClasses.containsKey(type) && annotationClass != null)
51+ruleAnnotationClasses.put(type, annotationClass);
4652try {
4753Constructor<? extends ValidationRule> constructor = type.getDeclaredConstructor(String[].class);
4854constructor.setAccessible(true);
@@ -296,31 +302,31 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
296302if (type.equals(Long.class))
297303return rules;
298304if (type.equals(Timestamp.class) || type.equals(java.util.Date.class)) {
299-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule(new String[]{}))));
305+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{}))));
300306return rules;
301307 }
302308if (type.equals(Date.class)) {
303-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule(new String[]{"date"}))));
309+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{"date"}))));
304310return rules;
305311 }
306312if (type.equals(Boolean.class)) {
307-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule())));
313+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule.Validator())));
308314return rules;
309315 }
310316if (type.equals(Integer.class)) {
311-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule(Integer.MIN_VALUE, Integer.MAX_VALUE))));
317+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule.Validator(Integer.MIN_VALUE, Integer.MAX_VALUE))));
312318return rules;
313319 }
314320if (type.equals(Double.class) || type.equals(Float.class)) {
315-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule())));
321+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule.Validator())));
316322return rules;
317323 }
318324if (type.equals(UUID.class)) {
319-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule())));
325+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule.Validator())));
320326return rules;
321327 }
322328if (type.isEnum()) {
323-rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule((Class<? extends Enum<?>>) type))));
329+rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule.Validator((Class<? extends Enum<?>>) type))));
324330return rules;
325331 }
326332if (type.isArray()) {
@@ -352,6 +358,19 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
352358if (r.size() > 0)
353359addMapRules(f, rules, new String[]{name}, r);
354360 }
361+ruleAnnotationClasses.entrySet().stream().distinct().forEach(annotation -> {
362+Annotation a = f.getDeclaredAnnotation(annotation.getValue());
363+if (a != null) {
364+List<ValidationRule> r = new ArrayList<>();
365+try {
366+Constructor<ValidationRule> constructor = (Constructor<ValidationRule>) annotation.getKey().getDeclaredConstructor(annotation.getValue());
367+constructor.setAccessible(true);
368+r.add(constructor.newInstance(a));
369+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException ignored) {}
370+if (r.size() > 0)
371+addMapRules(f, rules, new String[]{name}, r);
372+ }
373+ });
355374 }
356375return rules;
357376 }