Skip to content

Commit e0682ff

Browse files
committed
Added Annotations
1 parent d42aa34 commit e0682ff

17 files changed

+504
-286
lines changed

src/main/java/org/javawebstack/validator/Validator.java

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.javawebstack.abstractdata.AbstractNull;
88
import org.javawebstack.validator.rule.*;
99

10+
import java.lang.annotation.Annotation;
1011
import java.lang.reflect.Constructor;
1112
import java.lang.reflect.Field;
1213
import java.lang.reflect.InvocationTargetException;
@@ -19,27 +20,47 @@ 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<>();
2122

23+
private static final List<Class<? extends Annotation>> RULE_ANNOTATIONS = Arrays.asList(
24+
StringRule.class,
25+
BooleanRule.class,
26+
EnumRule.class,
27+
RequiredRule.class,
28+
IPv4AddressRule.class,
29+
IPv6AddressRule.class,
30+
IntegerRule.class,
31+
NumericRule.class,
32+
DateRule.class,
33+
ArrayRule.class,
34+
AlphaRule.class,
35+
AlphaNumRule.class,
36+
AlphaDashRule.class,
37+
EmailRule.class,
38+
RegexRule.class,
39+
UUIDRule.class
40+
);
41+
2242
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);
43+
registerRuleType("string", StringRule.Validator.class);
44+
registerRuleType("boolean", BooleanRule.Validator.class);
45+
registerRuleType("bool", BooleanRule.Validator.class);
46+
registerRuleType("enum", EnumRule.Validator.class);
47+
registerRuleType("required", RequiredRule.Validator.class);
48+
registerRuleType("req", RequiredRule.Validator.class);
49+
registerRuleType("ipv4", IPv4AddressRule.Validator.class);
50+
registerRuleType("ipv6", IPv6AddressRule.Validator.class);
51+
registerRuleType("int", IntegerRule.Validator.class);
52+
registerRuleType("integer", IntegerRule.Validator.class);
53+
registerRuleType("numeric", NumericRule.Validator.class);
54+
registerRuleType("num", NumericRule.Validator.class);
55+
registerRuleType("date", DateRule.Validator.class);
56+
registerRuleType("array", ArrayRule.Validator.class);
57+
registerRuleType("list", ArrayRule.Validator.class);
58+
registerRuleType("alpha", AlphaRule.Validator.class);
59+
registerRuleType("alpha_num", AlphaNumRule.Validator.class);
60+
registerRuleType("alpha_dash", AlphaDashRule.Validator.class);
61+
registerRuleType("email", EmailRule.Validator.class);
62+
registerRuleType("regex", RegexRule.Validator.class);
63+
registerRuleType("uuid", UUIDRule.Validator.class);
4364
}
4465

4566
public static void registerRuleType(String name, Class<? extends ValidationRule> type) {
@@ -296,31 +317,31 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
296317
if (type.equals(Long.class))
297318
return rules;
298319
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[]{}))));
320+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{}))));
300321
return rules;
301322
}
302323
if (type.equals(Date.class)) {
303-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule(new String[]{"date"}))));
324+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{"date"}))));
304325
return rules;
305326
}
306327
if (type.equals(Boolean.class)) {
307-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule())));
328+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule.Validator())));
308329
return rules;
309330
}
310331
if (type.equals(Integer.class)) {
311-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule(Integer.MIN_VALUE, Integer.MAX_VALUE))));
332+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule.Validator(Integer.MIN_VALUE, Integer.MAX_VALUE))));
312333
return rules;
313334
}
314335
if (type.equals(Double.class) || type.equals(Float.class)) {
315-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule())));
336+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule.Validator())));
316337
return rules;
317338
}
318339
if (type.equals(UUID.class)) {
319-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule())));
340+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule.Validator())));
320341
return rules;
321342
}
322343
if (type.isEnum()) {
323-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule((Class<? extends Enum<?>>) type))));
344+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule.Validator((Class<? extends Enum<?>>) type))));
324345
return rules;
325346
}
326347
if (type.isArray()) {
@@ -352,6 +373,19 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
352373
if (r.size() > 0)
353374
addMapRules(f, rules, new String[]{name}, r);
354375
}
376+
for (Class<? extends Annotation> annotation : RULE_ANNOTATIONS) {
377+
Annotation a = f.getDeclaredAnnotation(annotation);
378+
if (a != null) {
379+
List<ValidationRule> r = new ArrayList<>();
380+
try {
381+
Class<?> validatorClazz = Class.forName(annotation.getName() + "$Validator"); // stupid way of doing this;
382+
Constructor<ValidationRule> constructor = (Constructor<ValidationRule>) validatorClazz.getConstructor(annotation);
383+
r.add(constructor.newInstance(a));
384+
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException ignored) {}
385+
if (r.size() > 0)
386+
addMapRules(f, rules, new String[]{name}, r);
387+
}
388+
}
355389
}
356390
return rules;
357391
}

src/main/java/org/javawebstack/validator/rule/AlphaDashRule.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,31 @@
33
import org.javawebstack.abstractdata.AbstractElement;
44
import org.javawebstack.validator.ValidationContext;
55

6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
610
import java.lang.reflect.Field;
711

812
/**
913
* Rule: alpha_dash
1014
*/
11-
public class AlphaDashRule implements ValidationRule {
12-
@Override
13-
public String validate(ValidationContext context, Field field, AbstractElement value) {
14-
if (value == null || value.isNull())
15-
return null;
15+
@Target(ElementType.FIELD)
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface AlphaDashRule {
18+
class Validator implements ValidationRule {
19+
public Validator(AlphaDashRule rule) {}
20+
21+
@Override
22+
public String validate(ValidationContext context, Field field, AbstractElement value) {
23+
if (value == null || value.isNull())
24+
return null;
1625

17-
String pattern = "[A-Za-z0-9-_]*";
18-
if (!value.string().matches(pattern))
19-
return "Value must only contain alpha-numeric characters as well as dashes and underscores.";
26+
String pattern = "[A-Za-z0-9-_]*";
27+
if (!value.string().matches(pattern))
28+
return "Value must only contain alpha-numeric characters as well as dashes and underscores.";
2029

21-
return null;
30+
return null;
31+
}
2232
}
2333
}

src/main/java/org/javawebstack/validator/rule/AlphaNumRule.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,31 @@
33
import org.javawebstack.abstractdata.AbstractElement;
44
import org.javawebstack.validator.ValidationContext;
55

6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
610
import java.lang.reflect.Field;
711

812
/**
913
* Rule: alpha_num
1014
*/
11-
public class AlphaNumRule implements ValidationRule {
12-
@Override
13-
public String validate(ValidationContext context, Field field, AbstractElement value) {
14-
if (value == null || value.isNull())
15-
return null;
15+
@Target(ElementType.FIELD)
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface AlphaNumRule {
18+
class Validator implements ValidationRule {
19+
public Validator(AlphaNumRule rule) {}
20+
21+
@Override
22+
public String validate(ValidationContext context, Field field, AbstractElement value) {
23+
if (value == null || value.isNull())
24+
return null;
1625

17-
String pattern = "[A-Za-z0-9]*";
18-
if (!value.string().matches(pattern))
19-
return "Value must only contain alpha-numeric characters.";
26+
String pattern = "[A-Za-z0-9]*";
27+
if (!value.string().matches(pattern))
28+
return "Value must only contain alpha-numeric characters.";
2029

21-
return null;
30+
return null;
31+
}
2232
}
2333
}

src/main/java/org/javawebstack/validator/rule/AlphaRule.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,31 @@
33
import org.javawebstack.abstractdata.AbstractElement;
44
import org.javawebstack.validator.ValidationContext;
55

6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
610
import java.lang.reflect.Field;
711

812
/**
913
* Rule: alpha
1014
*/
11-
public class AlphaRule implements ValidationRule {
12-
@Override
13-
public String validate(ValidationContext context, Field field, AbstractElement value) {
14-
if (value == null || value.isNull())
15-
return null;
15+
@Target(ElementType.FIELD)
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface AlphaRule {
18+
class Validator implements ValidationRule {
19+
public Validator(AlphaRule rule) {}
20+
21+
@Override
22+
public String validate(ValidationContext context, Field field, AbstractElement value) {
23+
if (value == null || value.isNull())
24+
return null;
1625

17-
String pattern = "[A-Za-z]*";
18-
if (!value.string().matches(pattern))
19-
return "Value must only contain alphabetic characters.";
26+
String pattern = "[A-Za-z]*";
27+
if (!value.string().matches(pattern))
28+
return "Value must only contain alphabetic characters.";
2029

21-
return null;
30+
return null;
31+
}
2232
}
2333
}

src/main/java/org/javawebstack/validator/rule/ArrayRule.java

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,55 @@
33
import org.javawebstack.abstractdata.AbstractElement;
44
import org.javawebstack.validator.ValidationContext;
55

6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
610
import java.lang.reflect.Field;
711

812
/**
913
* Rule: array, list
1014
*/
11-
public class ArrayRule implements ValidationRule {
12-
13-
private final int min;
14-
private final int max;
15-
16-
public ArrayRule(int min, int max) {
17-
this.min = min;
18-
this.max = max;
19-
}
20-
21-
public ArrayRule(String[] params) {
22-
int min = 0;
23-
int max = Integer.MAX_VALUE;
24-
if (params.length > 0)
25-
min = Integer.parseInt(params[0]);
26-
if (params.length > 1)
27-
max = Integer.parseInt(params[1]);
28-
this.min = min;
29-
this.max = max;
30-
}
31-
32-
public String validate(ValidationContext context, Field field, AbstractElement value) {
33-
if (value == null || value.isNull())
15+
@Target(ElementType.FIELD)
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface ArrayRule {
18+
int min();
19+
int max();
20+
21+
class Validator implements ValidationRule {
22+
private final int min;
23+
private final int max;
24+
25+
public Validator(ArrayRule rule) {
26+
this(rule.min(), rule.max());
27+
}
28+
29+
public Validator(int min, int max) {
30+
this.min = min;
31+
this.max = max;
32+
}
33+
34+
public Validator(String[] params) {
35+
int min = 0;
36+
int max = Integer.MAX_VALUE;
37+
if (params.length > 0)
38+
min = Integer.parseInt(params[0]);
39+
if (params.length > 1)
40+
max = Integer.parseInt(params[1]);
41+
this.min = min;
42+
this.max = max;
43+
}
44+
45+
public String validate(ValidationContext context, Field field, AbstractElement value) {
46+
if (value == null || value.isNull())
47+
return null;
48+
if (!value.isArray())
49+
return "Not an array";
50+
if (value.array().size() < min)
51+
return String.format("Shorter than minimum array length (%d < %d)", value.array().size(), min);
52+
if (value.array().size() > max)
53+
return String.format("Longer than maximum array length (%d > %d)", value.array().size(), max);
3454
return null;
35-
if (!value.isArray())
36-
return "Not an array";
37-
if (value.array().size() < min)
38-
return String.format("Shorter than minimum array length (%d < %d)", value.array().size(), min);
39-
if (value.array().size() > max)
40-
return String.format("Longer than maximum array length (%d > %d)", value.array().size(), max);
41-
return null;
55+
}
4256
}
43-
4457
}

src/main/java/org/javawebstack/validator/rule/BooleanRule.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,31 @@
33
import org.javawebstack.abstractdata.AbstractElement;
44
import org.javawebstack.validator.ValidationContext;
55

6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
610
import java.lang.reflect.Field;
711

812
/**
913
* Rule: boolean, bool
1014
*/
11-
public class BooleanRule implements ValidationRule {
12-
public String validate(ValidationContext context, Field field, AbstractElement value) {
13-
if (value == null || value.isNull())
14-
return null;
15-
if (value.isBoolean())
16-
return null;
17-
if (value.isString() && (value.string().equals("true") || value.string().equals("false")))
18-
return null;
19-
return "Not a boolean value";
15+
@Target(ElementType.FIELD)
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface BooleanRule {
18+
class Validator implements ValidationRule {
19+
public Validator(BooleanRule rule) {}
20+
21+
public Validator() {}
22+
23+
public String validate(ValidationContext context, Field field, AbstractElement value) {
24+
if (value == null || value.isNull())
25+
return null;
26+
if (value.isBoolean())
27+
return null;
28+
if (value.isString() && (value.string().equals("true") || value.string().equals("false")))
29+
return null;
30+
return "Not a boolean value";
31+
}
2032
}
2133
}

0 commit comments

Comments
 (0)