Merge pull request #5 from JavaWebStack/feature/annotations · JavaWebStack/validator@e96fe03

@@ -7,6 +7,7 @@

77

import org.javawebstack.abstractdata.AbstractNull;

88

import org.javawebstack.validator.rule.*;

9910+

import java.lang.annotation.Annotation;

1011

import java.lang.reflect.Constructor;

1112

import java.lang.reflect.Field;

1213

import java.lang.reflect.InvocationTargetException;

@@ -19,30 +20,35 @@ public class Validator {

1920

private static final Map<String, Constructor<? extends ValidationRule>> validationRules = new HashMap<>();

2021

private static final Map<Class<?>, Validator> validators = new HashMap<>();

212223+

private static final Map<Class<? extends ValidationRule>, Class<? extends Annotation>> ruleAnnotationClasses = new HashMap<>();

24+2225

static {

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

4652

try {

4753

Constructor<? extends ValidationRule> constructor = type.getDeclaredConstructor(String[].class);

4854

constructor.setAccessible(true);

@@ -296,31 +302,31 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<

296302

if (type.equals(Long.class))

297303

return rules;

298304

if (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[]{}))));

300306

return rules;

301307

}

302308

if (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"}))));

304310

return rules;

305311

}

306312

if (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())));

308314

return rules;

309315

}

310316

if (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))));

312318

return rules;

313319

}

314320

if (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())));

316322

return rules;

317323

}

318324

if (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())));

320326

return rules;

321327

}

322328

if (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))));

324330

return rules;

325331

}

326332

if (type.isArray()) {

@@ -352,6 +358,19 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<

352358

if (r.size() > 0)

353359

addMapRules(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

}

356375

return rules;

357376

}