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