2020import java .util .OptionalLong ;
2121import java .util .Random ;
2222import java .util .UUID ;
23- import java .util .function .BiPredicate ;
2423import java .util .function .Function ;
25- import java .util .function .Predicate ;
2624
2725import org .apache .commons .logging .Log ;
2826import org .apache .commons .logging .LogFactory ;
@@ -98,11 +96,11 @@ private Object getRandomValue(String type) {
9896 }
9997 String range = getRange (type , "int" );
10098 if (range != null ) {
101- return getNextIntInRange (range );
99+ return getNextIntInRange (Range . of ( range , Integer :: parseInt ) );
102100 }
103101 range = getRange (type , "long" );
104102 if (range != null ) {
105- return getNextLongInRange (range );
103+ return getNextLongInRange (Range . of ( range , Long :: parseLong ) );
106104 }
107105 if (type .equals ("uuid" )) {
108106 return UUID .randomUUID ().toString ();
@@ -120,24 +118,22 @@ private String getRange(String type, String prefix) {
120118 return null ;
121119 }
122120
123- private int getNextIntInRange (String range ) {
124- Range <Integer > intRange = Range .get (range , Integer ::parseInt , (t ) -> t > 0 , 0 , (t1 , t2 ) -> t1 < t2 );
125- OptionalInt first = getSource ().ints (1 , intRange .getMin (), intRange .getMax ()).findFirst ();
126- if (!first .isPresent ()) {
127- throw new RuntimeException ("Could not get random number for range '" + range + "'" );
128- }
121+ private int getNextIntInRange (Range <Integer > range ) {
122+ OptionalInt first = getSource ().ints (1 , range .getMin (), range .getMax ()).findFirst ();
123+ assertPresent (first .isPresent (), range );
129124 return first .getAsInt ();
130125 }
131126
132- private long getNextLongInRange (String range ) {
133- Range <Long > longRange = Range .get (range , Long ::parseLong , (t ) -> t > 0L , 0L , (t1 , t2 ) -> t1 < t2 );
134- OptionalLong first = getSource ().longs (1 , longRange .getMin (), longRange .getMax ()).findFirst ();
135- if (!first .isPresent ()) {
136- throw new RuntimeException ("Could not get random number for range '" + range + "'" );
137- }
127+ private long getNextLongInRange (Range <Long > range ) {
128+ OptionalLong first = getSource ().longs (1 , range .getMin (), range .getMax ()).findFirst ();
129+ assertPresent (first .isPresent (), range );
138130 return first .getAsLong ();
139131 }
140132
133+ private void assertPresent (boolean present , Range <?> range ) {
134+ Assert .state (present , () -> "Could not get random number for range '" + range + "'" );
135+ }
136+
141137 private Object getRandomBytes () {
142138 byte [] bytes = new byte [32 ];
143139 getSource ().nextBytes (bytes );
@@ -167,27 +163,16 @@ static void addToEnvironment(ConfigurableEnvironment environment, Log logger) {
167163
168164 static final class Range <T extends Number > {
169165
166+ private final String value ;
167+
170168 private final T min ;
171169
172170 private final T max ;
173171
174- private Range (T min , T max ) {
172+ private Range (String value , T min , T max ) {
173+ this .value = value ;
175174 this .min = min ;
176175 this .max = max ;
177-
178- }
179-
180- static <T extends Number > Range <T > get (String range , Function <String , T > parse , Predicate <T > boundValidator ,
181- T defaultMin , BiPredicate <T , T > rangeValidator ) {
182- String [] tokens = StringUtils .commaDelimitedListToStringArray (range );
183- T token1 = parse .apply (tokens [0 ]);
184- if (tokens .length == 1 ) {
185- Assert .isTrue (boundValidator .test (token1 ), "Bound must be positive." );
186- return new Range <>(defaultMin , token1 );
187- }
188- T token2 = parse .apply (tokens [1 ]);
189- Assert .isTrue (rangeValidator .test (token1 , token2 ), "Lower bound must be less than upper bound." );
190- return new Range <>(token1 , token2 );
191176 }
192177
193178 T getMin () {
@@ -198,6 +183,24 @@ T getMax() {
198183 return this .max ;
199184 }
200185
186+ @ Override
187+ public String toString () {
188+ return this .value ;
189+ }
190+
191+ static <T extends Number & Comparable <T >> Range <T > of (String value , Function <String , T > parse ) {
192+ T zero = parse .apply ("0" );
193+ String [] tokens = StringUtils .commaDelimitedListToStringArray (value );
194+ T min = parse .apply (tokens [0 ]);
195+ if (tokens .length == 1 ) {
196+ Assert .isTrue (min .compareTo (zero ) > 0 , "Bound must be positive." );
197+ return new Range <>(value , zero , min );
198+ }
199+ T max = parse .apply (tokens [1 ]);
200+ Assert .isTrue (min .compareTo (max ) < 0 , "Lower bound must be less than upper bound." );
201+ return new Range <>(value , min , max );
202+ }
203+
201204 }
202205
203206}
0 commit comments