Skip to content

Commit 42bd524

Browse files
authored
Merge pull request #6 from JavaWebStack/dev
Release 1.0.1
2 parents d42aa34 + 8c2e01d commit 42bd524

24 files changed

+605
-301
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ You can find the current docs on our [website](https://docs.javawebstack.org/fra
2222
<dependency>
2323
<groupId>org.javawebstack</groupId>
2424
<artifactId>validator</artifactId>
25-
<version>1.0.0</version>
25+
<version>1.0.1</version>
2626
</dependency>
27-
```
27+
```

pom.xml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<properties>
88
<maven.compiler.source>8</maven.compiler.source>
99
<maven.compiler.target>8</maven.compiler.target>
10-
<buildVersion>1.0.0-SNAPSHOT</buildVersion>
10+
<buildVersion>1.0.1-SNAPSHOT</buildVersion>
1111
</properties>
1212

1313
<groupId>org.javawebstack</groupId>
@@ -44,8 +44,15 @@
4444
<dependency>
4545
<groupId>org.javawebstack</groupId>
4646
<artifactId>abstract-data</artifactId>
47-
<version>1.0.0</version>
47+
<version>1.0.4</version>
4848
</dependency>
49+
<!--- Temporary fix for transitive vulnerabilities -->
50+
<dependency>
51+
<groupId>org.yaml</groupId>
52+
<artifactId>snakeyaml</artifactId>
53+
<version>1.33</version>
54+
</dependency>
55+
<!--- ============================================ -->
4956
<dependency>
5057
<groupId>com.sun.mail</groupId>
5158
<artifactId>javax.mail</artifactId>
@@ -142,4 +149,4 @@
142149
</repository>
143150
</distributionManagement>
144151

145-
</project>
152+
</project>

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

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package org.javawebstack.validator;
22

3-
import com.google.gson.annotations.SerializedName;
43
import org.javawebstack.abstractdata.AbstractArray;
54
import org.javawebstack.abstractdata.AbstractElement;
65
import org.javawebstack.abstractdata.AbstractMapper;
76
import org.javawebstack.abstractdata.AbstractNull;
7+
import org.javawebstack.abstractdata.mapper.MapperTypeSpec;
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,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<>();
2122

23+
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
}
4448

45-
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);
@@ -271,10 +277,13 @@ private static String toSnakeCase(String source) {
271277
}
272278

273279
private static String getFieldName(Field field) {
274-
SerializedName[] serializedNames = field.getAnnotationsByType(SerializedName.class);
275-
if (serializedNames.length > 0)
276-
return serializedNames[0].value();
277-
return toSnakeCase(field.getName());
280+
MapperTypeSpec typeSpec = MapperTypeSpec.get(field.getDeclaringClass());
281+
if(typeSpec == null)
282+
return toSnakeCase(field.getName());
283+
MapperTypeSpec.FieldSpec fieldSpec = typeSpec.getFieldSpecs().stream().filter(f -> f.getField().equals(field)).findFirst().orElse(null);
284+
if(fieldSpec == null || fieldSpec.getName() == null)
285+
return toSnakeCase(field.getName());
286+
return fieldSpec.getName();
278287
}
279288

280289
private static class ValidationConfig {
@@ -296,31 +305,31 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
296305
if (type.equals(Long.class))
297306
return rules;
298307
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[]{}))));
308+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{}))));
300309
return rules;
301310
}
302311
if (type.equals(Date.class)) {
303-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule(new String[]{"date"}))));
312+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DateRule.Validator(new String[]{"date"}))));
304313
return rules;
305314
}
306315
if (type.equals(Boolean.class)) {
307-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule())));
316+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new BooleanRule.Validator())));
308317
return rules;
309318
}
310319
if (type.equals(Integer.class)) {
311-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule(Integer.MIN_VALUE, Integer.MAX_VALUE))));
320+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new IntegerRule.Validator(Integer.MIN_VALUE, Integer.MAX_VALUE))));
312321
return rules;
313322
}
314323
if (type.equals(Double.class) || type.equals(Float.class)) {
315-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule())));
324+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule.Validator())));
316325
return rules;
317326
}
318327
if (type.equals(UUID.class)) {
319-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule())));
328+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new UUIDRule.Validator())));
320329
return rules;
321330
}
322331
if (type.isEnum()) {
323-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule((Class<? extends Enum<?>>) type))));
332+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new EnumRule.Validator((Class<? extends Enum<?>>) type))));
324333
return rules;
325334
}
326335
if (type.isArray()) {
@@ -352,6 +361,19 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
352361
if (r.size() > 0)
353362
addMapRules(f, rules, new String[]{name}, r);
354363
}
364+
ruleAnnotationClasses.entrySet().stream().distinct().forEach(annotation -> {
365+
Annotation a = f.getDeclaredAnnotation(annotation.getValue());
366+
if (a != null) {
367+
List<ValidationRule> r = new ArrayList<>();
368+
try {
369+
Constructor<ValidationRule> constructor = (Constructor<ValidationRule>) annotation.getKey().getDeclaredConstructor(annotation.getValue());
370+
constructor.setAccessible(true);
371+
r.add(constructor.newInstance(a));
372+
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException ignored) {}
373+
if (r.size() > 0)
374+
addMapRules(f, rules, new String[]{name}, r);
375+
}
376+
});
355377
}
356378
return rules;
357379
}

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,32 @@
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+
public Validator() {}
21+
22+
@Override
23+
public String validate(ValidationContext context, Field field, AbstractElement value) {
24+
if (value == null || value.isNull())
25+
return null;
1626

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.";
27+
String pattern = "[A-Za-z0-9-_]*";
28+
if (!value.string().matches(pattern))
29+
return "Value must only contain alpha-numeric characters as well as dashes and underscores.";
2030

21-
return null;
31+
return null;
32+
}
2233
}
2334
}

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,32 @@
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+
public Validator() {}
21+
22+
@Override
23+
public String validate(ValidationContext context, Field field, AbstractElement value) {
24+
if (value == null || value.isNull())
25+
return null;
1626

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

21-
return null;
31+
return null;
32+
}
2233
}
2334
}

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,32 @@
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+
public Validator() {}
21+
22+
@Override
23+
public String validate(ValidationContext context, Field field, AbstractElement value) {
24+
if (value == null || value.isNull())
25+
return null;
1626

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

21-
return null;
31+
return null;
32+
}
2233
}
2334
}

0 commit comments

Comments
 (0)