2
2
3
3
import static io .avaje .validation .core .adapters .InfinityNumberComparatorHelper .GREATER_THAN ;
4
4
import static io .avaje .validation .core .adapters .InfinityNumberComparatorHelper .LESS_THAN ;
5
+ import static io .avaje .validation .core .adapters .NumberComparatorHelper .compareDouble ;
6
+ import static io .avaje .validation .core .adapters .NumberComparatorHelper .compareFloat ;
5
7
6
8
import java .math .BigDecimal ;
9
+ import java .math .BigInteger ;
7
10
import java .util .Optional ;
8
11
9
12
import io .avaje .validation .adapter .AbstractConstraintAdapter ;
10
- import io .avaje .validation .adapter .ValidationAdapter ;
11
13
import io .avaje .validation .adapter .ValidationContext ;
12
14
import io .avaje .validation .adapter .ValidationContext .AdapterCreateRequest ;
13
15
@@ -29,19 +31,26 @@ private NumberAdapters() {}
29
31
default -> null ;
30
32
};
31
33
32
- private static ValidationAdapter <? > forMax (AdapterCreateRequest request ) {
34
+ private static AbstractConstraintAdapter <? extends Number > forMax (AdapterCreateRequest request ) {
33
35
final String targetType = request .targetType ();
34
- if (targetType == null ) {
35
- return new MaxAdapter (request );
36
- }
37
36
return switch (targetType ) {
38
- case "Integer" -> new NumMax .IntegerAdapter (request );
39
- case "Long" -> new NumMax .LongAdapter (request );
40
- case "BigDecimal" -> new NumMax .BigDecimalAdapter (request );
37
+ case "BigDecimal" -> new MaxBigDecimal (request );
38
+ case "BigInteger" -> new MaxBigInteger (request );
41
39
default -> new MaxAdapter (request );
42
40
};
43
41
}
44
42
43
+ private static AbstractConstraintAdapter <? extends Number > forMin (AdapterCreateRequest request ) {
44
+ // final String targetType = request.targetType();
45
+ // return switch (targetType) {
46
+ // case "BigDecimal" -> new MinBigDecimal(request);
47
+ // case "BigInteger" -> new MinBigInteger(request);
48
+ // default -> new MinAdapter(request);
49
+ // };
50
+ return new MinAdapter (request );
51
+ }
52
+
53
+
45
54
private static final class DecimalMaxAdapter extends AbstractConstraintAdapter <Number > {
46
55
47
56
private final BigDecimal value ;
@@ -62,7 +71,6 @@ public boolean isValid(Number number) {
62
71
}
63
72
64
73
final int comparisonResult = NumberComparatorHelper .compareDecimal (number , value , LESS_THAN );
65
-
66
74
return !(inclusive ? comparisonResult > 0 : comparisonResult >= 0 );
67
75
}
68
76
}
@@ -87,53 +95,82 @@ public boolean isValid(Number number) {
87
95
}
88
96
89
97
final int comparisonResult = NumberComparatorHelper .compareDecimal (number , value , LESS_THAN );
90
-
91
98
return !(inclusive ? comparisonResult < 0 : comparisonResult <= 0 );
92
99
}
93
100
}
94
101
95
- private static final class MaxAdapter extends AbstractConstraintAdapter <Number > {
102
+ public interface NumberAdapter <T extends Number > {
103
+ boolean isValid (T number );
104
+ }
105
+
106
+ private static final class MaxAdapter extends AbstractConstraintAdapter <Number > implements NumberAdapter <Number > {
96
107
97
108
private final long value ;
109
+ private final String targetType ;
98
110
99
111
MaxAdapter (AdapterCreateRequest request ) {
100
112
super (request );
101
- final var attributes = request .attributes ();
102
- this .value = (long ) attributes .get ("value" );
103
- }
104
-
105
- MaxAdapter (AdapterCreateRequest request , long value ) {
106
- super (request );
107
- this .value = value ;
113
+ this .targetType = request .targetType ();
114
+ this .value = (long ) request .attribute ("value" );
108
115
}
109
116
110
117
@ Override
111
118
public boolean isValid (Number number ) {
112
119
// null values are valid
120
+ if (number == null ) {
121
+ return true ;
122
+ }
123
+ return switch (targetType ) {
124
+ case "Integer" , "Long" , "Short" , "Byte" -> number .longValue () <= value ;
125
+ case "Double" -> compareDouble (number .doubleValue (), value , GREATER_THAN ) <= 0 ;
126
+ case "Float" -> compareFloat ((Float )number , value , GREATER_THAN ) <= 0 ;
127
+ default -> throw new IllegalStateException ();
128
+ };
129
+ }
130
+ }
131
+
132
+ static final class MaxBigDecimal extends AbstractConstraintAdapter <BigDecimal > implements NumberAdapter <BigDecimal > {
133
+
134
+ private final BigDecimal max ;
113
135
114
- return number == null || NumberComparatorHelper .compare (number , value , GREATER_THAN ) <= 0 ;
136
+ MaxBigDecimal (AdapterCreateRequest request ) {
137
+ super (request );
138
+ this .max = new BigDecimal (String .valueOf (request .attribute ("value" )));
139
+ }
140
+
141
+ @ Override
142
+ public boolean isValid (BigDecimal number ) {
143
+ return number == null || number .compareTo (max ) <= 0 ;
115
144
}
116
145
}
117
146
118
- private static final class MinAdapter extends AbstractConstraintAdapter <Number > {
147
+ static final class MaxBigInteger extends AbstractConstraintAdapter <BigInteger > implements NumberAdapter < BigInteger > {
119
148
120
- private final long value ;
149
+ private final BigInteger max ;
121
150
122
- MinAdapter (AdapterCreateRequest request ) {
151
+ MaxBigInteger (AdapterCreateRequest request ) {
123
152
super (request );
124
- final var attributes = request .attributes ();
125
- this .value = (long ) attributes .get ("value" );
153
+ this .max = new BigInteger (String .valueOf (request .attribute ("value" )));
126
154
}
127
155
128
- MinAdapter (AdapterCreateRequest request , long value ) {
156
+ @ Override
157
+ public boolean isValid (BigInteger number ) {
158
+ return number == null || number .compareTo (max ) <= 0 ;
159
+ }
160
+ }
161
+
162
+ private static final class MinAdapter extends AbstractConstraintAdapter <Number > implements NumberAdapter <Number > {
163
+
164
+ private final long value ;
165
+
166
+ MinAdapter (AdapterCreateRequest request ) {
129
167
super (request );
130
- this .value = value ;
168
+ this .value = ( long ) request . attribute ( " value" ) ;
131
169
}
132
170
133
171
@ Override
134
172
public boolean isValid (Number number ) {
135
173
// null values are valid
136
-
137
174
return number == null || NumberComparatorHelper .compare (number , value , LESS_THAN ) >= 0 ;
138
175
}
139
176
}
@@ -145,9 +182,8 @@ private static final class DigitsAdapter extends AbstractConstraintAdapter<Objec
145
182
146
183
DigitsAdapter (AdapterCreateRequest request ) {
147
184
super (request );
148
- final var attributes = request .attributes ();
149
- this .integer = (int ) attributes .get ("integer" );
150
- this .fraction = (int ) attributes .get ("fraction" );
185
+ this .integer = (int ) request .attribute ("integer" );
186
+ this .fraction = (int ) request .attribute ("fraction" );
151
187
}
152
188
153
189
@ Override
@@ -166,7 +202,6 @@ public boolean isValid(Object value) {
166
202
167
203
final int integerPartLength = bigNum .precision () - bigNum .scale ();
168
204
final int fractionPartLength = Math .max (bigNum .scale (), 0 );
169
-
170
205
return (integer >= integerPartLength ) && (fraction >= fractionPartLength );
171
206
}
172
207
}
@@ -188,7 +223,6 @@ public boolean isValid(Object value) {
188
223
}
189
224
190
225
final int sign = NumberSignHelper .signum (value , LESS_THAN );
191
-
192
226
return !(inclusive ? sign < 0 : sign <= 0 );
193
227
}
194
228
}
@@ -210,28 +244,26 @@ public boolean isValid(Object value) {
210
244
}
211
245
212
246
final int sign = NumberSignHelper .signum (value , GREATER_THAN );
213
-
214
247
return !(inclusive ? sign > 0 : sign >= 0 );
215
248
}
216
249
}
217
250
218
251
private static final class RangeAdapter extends AbstractConstraintAdapter <Object > {
219
252
220
- private final MaxAdapter maxAdapter ;
221
- private final MinAdapter minAdapter ;
253
+ private final NumberAdapter < Number > maxAdapter ;
254
+ private final NumberAdapter < Number > minAdapter ;
222
255
256
+ @ SuppressWarnings ("unchecked" )
223
257
RangeAdapter (AdapterCreateRequest request ) {
224
258
super (request );
225
- final var attributes = request .attributes ();
226
- final var min = (long ) attributes .get ("min" );
227
- final var max = (long ) attributes .get ("max" );
228
- this .maxAdapter = new MaxAdapter (request , max );
229
- this .minAdapter = new MinAdapter (request , min );
259
+ final var min = (long ) request .attribute ("min" );
260
+ final var max = (long ) request .attribute ("max" );
261
+ this .maxAdapter = (NumberAdapter <Number >)forMax (request .withValue (max ));
262
+ this .minAdapter = (NumberAdapter <Number >)forMin (request .withValue (min ));
230
263
}
231
264
232
265
@ Override
233
266
public boolean isValid (Object value ) {
234
-
235
267
if (value instanceof final String s ) {
236
268
value = Long .parseLong (s );
237
269
}
0 commit comments