mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-29 10:50:33 +00:00
Refactor NumberToDataSizeConverter to use DataSize.ofBytes(long) directly
Prior to this commit, a `Number` was converted to a `String` and then the string was parsed/matched using regular expressions back into a suitable `long` which was inefficient and also prevented valid data size values such as 10.0. To address those issues, this commit refactors NumberToDataSizeConverter to use DataSize.ofBytes(long) directly, first checking that the supplied Number does not have a fractional part. Closes gh-36956 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
This commit is contained in:
+7
-2
@@ -23,15 +23,20 @@ import org.springframework.util.unit.DataSize;
|
||||
* Converts from a {@link Number} to a {@link DataSize}.
|
||||
*
|
||||
* @author YeongJae Min
|
||||
* @author Yanming Zhou
|
||||
* @since 7.1
|
||||
* @see DataSize#parse(CharSequence)
|
||||
* @see DataSize#ofBytes(long)
|
||||
* @see StringToDataSizeConverter
|
||||
*/
|
||||
final class NumberToDataSizeConverter implements Converter<Number, DataSize> {
|
||||
|
||||
@Override
|
||||
public DataSize convert(Number source) {
|
||||
return DataSize.parse(source.toString());
|
||||
long bytes = source.longValue();
|
||||
if (source.doubleValue() - bytes != 0) {
|
||||
throw new IllegalArgumentException("'" + source + "' is not a valid data size");
|
||||
}
|
||||
return DataSize.ofBytes(bytes);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+6
@@ -76,6 +76,8 @@ import static org.assertj.core.api.Assertions.entry;
|
||||
* @author Juergen Hoeller
|
||||
* @author Stephane Nicoll
|
||||
* @author Sam Brannen
|
||||
* @author YeongJae Min
|
||||
* @author Yanming Zhou
|
||||
*/
|
||||
class DefaultConversionServiceTests {
|
||||
|
||||
@@ -258,12 +260,16 @@ class DefaultConversionServiceTests {
|
||||
void numberToDataSizeWithDecimalNumber() {
|
||||
assertThatExceptionOfType(ConversionFailedException.class)
|
||||
.isThrownBy(() -> conversionService.convert(10.5, DataSize.class));
|
||||
assertThatExceptionOfType(ConversionFailedException.class)
|
||||
.isThrownBy(() -> conversionService.convert(new BigDecimal("10.5"), DataSize.class));
|
||||
}
|
||||
|
||||
@Test // gh-36830
|
||||
void numberToDataSize() {
|
||||
assertThat(conversionService.convert(10, DataSize.class)).isEqualTo(DataSize.ofBytes(10));
|
||||
assertThat(conversionService.convert(-10L, DataSize.class)).isEqualTo(DataSize.ofBytes(-10));
|
||||
assertThat(conversionService.convert(new BigDecimal("10"), DataSize.class)).isEqualTo(DataSize.ofBytes(10));
|
||||
assertThat(conversionService.convert(new BigDecimal("10.0"), DataSize.class)).isEqualTo(DataSize.ofBytes(10));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user