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 );
@@ -152,27 +148,16 @@ public static void addToEnvironment(ConfigurableEnvironment environment) {
152148
153149 static final class Range <T extends Number > {
154150
151+ private final String value ;
152+
155153 private final T min ;
156154
157155 private final T max ;
158156
159- private Range (T min , T max ) {
157+ private Range (String value , T min , T max ) {
158+ this .value = value ;
160159 this .min = min ;
161160 this .max = max ;
162-
163- }
164-
165- static <T extends Number > Range <T > get (String range , Function <String , T > parse , Predicate <T > boundValidator ,
166- T defaultMin , BiPredicate <T , T > rangeValidator ) {
167- String [] tokens = StringUtils .commaDelimitedListToStringArray (range );
168- T token1 = parse .apply (tokens [0 ]);
169- if (tokens .length == 1 ) {
170- Assert .isTrue (boundValidator .test (token1 ), "Bound must be positive." );
171- return new Range <>(defaultMin , token1 );
172- }
173- T token2 = parse .apply (tokens [1 ]);
174- Assert .isTrue (rangeValidator .test (token1 , token2 ), "Lower bound must be less than upper bound." );
175- return new Range <>(token1 , token2 );
176161 }
177162
178163 T getMin () {
@@ -183,6 +168,24 @@ T getMax() {
183168 return this .max ;
184169 }
185170
171+ @ Override
172+ public String toString () {
173+ return this .value ;
174+ }
175+
176+ static <T extends Number & Comparable <T >> Range <T > of (String value , Function <String , T > parse ) {
177+ T zero = parse .apply ("0" );
178+ String [] tokens = StringUtils .commaDelimitedListToStringArray (value );
179+ T min = parse .apply (tokens [0 ]);
180+ if (tokens .length == 1 ) {
181+ Assert .isTrue (min .compareTo (zero ) > 0 , "Bound must be positive." );
182+ return new Range <>(value , zero , min );
183+ }
184+ T max = parse .apply (tokens [1 ]);
185+ Assert .isTrue (min .compareTo (max ) < 0 , "Lower bound must be less than upper bound." );
186+ return new Range <>(value , min , max );
187+ }
188+
186189 }
187190
188191}
0 commit comments