Skip to content

Commit 90f472d

Browse files
authored
Merge pull request #8 from JavaWebStack/feature/moreNumberRules
Validation rule for doubles
2 parents 0f67bab + 4639125 commit 90f472d

File tree

4 files changed

+119
-4
lines changed

4 files changed

+119
-4
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class Validator {
3333
registerRuleType("ipv6", IPv6AddressRule.Validator.class, IPv6AddressRule.class);
3434
registerRuleType("int", IntegerRule.Validator.class, IntegerRule.class);
3535
registerRuleType("integer", IntegerRule.Validator.class, IntegerRule.class);
36+
registerRuleType("double", DoubleRule.Validator.class, DoubleRule.class);
3637
registerRuleType("numeric", NumericRule.Validator.class, NumericRule.class);
3738
registerRuleType("num", NumericRule.Validator.class, NumericRule.class);
3839
registerRuleType("date", DateRule.Validator.class, DateRule.class);
@@ -46,6 +47,8 @@ public class Validator {
4647
registerRuleType("uuid", UUIDRule.Validator.class, UUIDRule.class);
4748
}
4849

50+
private final Map<String[], ValidationConfig> rules = new HashMap<>();
51+
4952
public static void registerRuleType(String name, Class<? extends ValidationRule> type, Class<? extends Annotation> annotationClass) {
5053
if (!ruleAnnotationClasses.containsKey(type) && annotationClass != null)
5154
ruleAnnotationClasses.put(type, annotationClass);
@@ -130,8 +133,6 @@ public static <T> T map(ValidationContext context, Class<T> type, AbstractElemen
130133
return map(context, type, element, new AbstractMapper());
131134
}
132135

133-
private final Map<String[], ValidationConfig> rules = new HashMap<>();
134-
135136
public Validator rule(String[] key, ValidationRule... rules) {
136137
return rule(key, Arrays.asList(rules));
137138
}
@@ -321,7 +322,7 @@ private static Map<String[], ValidationConfig> getClassRules(Field field, Class<
321322
return rules;
322323
}
323324
if (type.equals(Double.class) || type.equals(Float.class)) {
324-
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new NumericRule.Validator())));
325+
rules.put(new String[0], new ValidationConfig(field, Collections.singletonList(new DoubleRule.Validator(Double.MIN_VALUE, Double.MAX_VALUE))));
325326
return rules;
326327
}
327328
if (type.equals(UUID.class)) {
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.javawebstack.validator.rule;
2+
3+
import org.javawebstack.abstractdata.AbstractElement;
4+
import org.javawebstack.validator.ValidationContext;
5+
6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
10+
import java.lang.reflect.Field;
11+
12+
@Target(ElementType.FIELD)
13+
@Retention(RetentionPolicy.RUNTIME)
14+
public @interface DoubleRule {
15+
16+
double min() default Double.MIN_VALUE;
17+
double max() default Double.MAX_VALUE;
18+
19+
class Validator implements ValidationRule {
20+
21+
private final double min;
22+
private final double max;
23+
24+
public Validator(DoubleRule rule) {
25+
this(rule.min(), rule.max());
26+
}
27+
28+
public Validator(double min, double max) {
29+
this.min = min;
30+
this.max = max;
31+
}
32+
33+
public Validator(String[] params) {
34+
double min = Double.MIN_VALUE;
35+
double max = Double.MAX_VALUE;
36+
if (params.length > 0)
37+
min = Double.parseDouble(params[0]);
38+
if (params.length > 1)
39+
max = Double.parseDouble(params[1]);
40+
this.min = min;
41+
this.max = max;
42+
}
43+
44+
public String validate(ValidationContext context, Field field, AbstractElement value) {
45+
if (value == null || value.isNull())
46+
return null;
47+
double v;
48+
if (value.isNumber()) {
49+
v = value.number().doubleValue();
50+
} else if (value.isString()) {
51+
try {
52+
v = Double.parseDouble(value.string());
53+
} catch (NumberFormatException ex) {
54+
return "Not a double value";
55+
}
56+
} else {
57+
return "Not a double value";
58+
}
59+
if (v < min)
60+
return String.format("Smaller than the minimum value (%f < %f)", v, min);
61+
if (v > max)
62+
return String.format("Greater than the maximum value (%f > %f)", v, max);
63+
return null;
64+
}
65+
66+
public String toString() {
67+
return "Validator{" +
68+
"min=" + min +
69+
", max=" + max +
70+
'}';
71+
}
72+
73+
}
74+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@Retention(RetentionPolicy.RUNTIME)
1717
public @interface IntegerRule {
1818
int min();
19-
int max();
19+
int max() default Integer.MAX_VALUE;
2020
int step() default 1;
2121

2222
class Validator implements ValidationRule {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package test.org.javawebstack.validator;
2+
3+
import org.javawebstack.abstractdata.AbstractMapper;
4+
import org.javawebstack.validator.ValidationContext;
5+
import org.javawebstack.validator.Validator;
6+
import org.javawebstack.validator.rule.DoubleRule;
7+
import org.junit.jupiter.api.Test;
8+
import static org.junit.jupiter.api.Assertions.*;
9+
10+
public class DoubleRuleTest {
11+
@Test
12+
public void testSimple() {
13+
Validator validator = Validator.getValidator(SimpleTest.class);
14+
SimpleTest test = new SimpleTest();
15+
test.value = "hello world";
16+
assertFalse(validator.validate(new ValidationContext(), new AbstractMapper().toAbstract(test)).isValid());
17+
test.value = "13.37";
18+
assertTrue(validator.validate(new ValidationContext(), new AbstractMapper().toAbstract(test)).isValid());
19+
}
20+
21+
@Test
22+
public void testEdgeCases() {
23+
Validator validator = Validator.getValidator(EdgeTest.class);
24+
EdgeTest test = new EdgeTest();
25+
test.value = 9.9;
26+
assertFalse(validator.validate(new ValidationContext(), new AbstractMapper().toAbstract(test)).isValid());
27+
test.value = 10.1;
28+
assertTrue(validator.validate(new ValidationContext(), new AbstractMapper().toAbstract(test)).isValid());
29+
}
30+
31+
private class SimpleTest {
32+
@DoubleRule
33+
String value;
34+
}
35+
36+
private class EdgeTest {
37+
@DoubleRule(min = 10)
38+
Double value;
39+
}
40+
}

0 commit comments

Comments
 (0)