diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java index 0dae54ad79..35a70baaa1 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.Locale; import java.util.UUID; import java.util.regex.Pattern; +import org.springframework.core.KotlinDetector; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.converter.ConverterRegistry; import org.springframework.lang.Nullable; @@ -170,6 +171,11 @@ public class DefaultConversionService extends GenericConversionService { converterRegistry.addConverter(new StringToPatternConverter()); converterRegistry.addConverter(Pattern.class, String.class, new ObjectToStringConverter()); + + if (KotlinDetector.isKotlinPresent()) { + converterRegistry.addConverter(new StringToRegexConverter()); + converterRegistry.addConverter(kotlin.text.Regex.class, String.class, new ObjectToStringConverter()); + } } } diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/StringToPatternConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/StringToPatternConverter.java index ff721ba431..689b48a0b1 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/StringToPatternConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/StringToPatternConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,15 +21,19 @@ import java.util.regex.Pattern; import org.springframework.core.convert.converter.Converter; /** - * Convert a String to a {@link Pattern}. + * Converts from a String to a {@link java.util.regex.Pattern}. * * @author Valery Yatsynovich - * @since 5.2 + * @author Stephane Nicoll + * @since 6.1 */ -class StringToPatternConverter implements Converter { +final class StringToPatternConverter implements Converter { @Override public Pattern convert(String source) { + if (source.isEmpty()) { + return null; + } return Pattern.compile(source); } diff --git a/spring-core/src/main/kotlin/org/springframework/core/convert/support/StringToRegexConverter.kt b/spring-core/src/main/kotlin/org/springframework/core/convert/support/StringToRegexConverter.kt new file mode 100644 index 0000000000..790dc99422 --- /dev/null +++ b/spring-core/src/main/kotlin/org/springframework/core/convert/support/StringToRegexConverter.kt @@ -0,0 +1,19 @@ +package org.springframework.core.convert.support + +import org.springframework.core.convert.converter.Converter + +/** + * Converts from a String to a [Regex]. + * + * @author Stephane Nicoll + */ +class StringToRegexConverter : Converter { + + override fun convert(source: String): Regex? { + if (source.isEmpty()) { + return null + } + return source.toRegex() + } + +} \ No newline at end of file diff --git a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java index bd8d68f387..f326cec724 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java @@ -319,10 +319,16 @@ class DefaultConversionServiceTests { assertThat(convertToUUID).isEqualTo(uuid); } + @Test + void stringToPatternEmptyString() { + assertThat(conversionService.convert("", Pattern.class)).isNull(); + } + @Test void stringToPattern() { - String regex = "\\s"; - assertThat(conversionService.convert(regex, Pattern.class)).extracting(Pattern::pattern).isEqualTo(regex); + String pattern = "\\s"; + assertThat(conversionService.convert(pattern, Pattern.class)) + .isInstanceOfSatisfying(Pattern.class, regex -> assertThat(regex.pattern()).isEqualTo(pattern)); } @Test diff --git a/spring-core/src/test/kotlin/org/springframework/core/convert/support/DefaultConversionServiceKotlinTests.kt b/spring-core/src/test/kotlin/org/springframework/core/convert/support/DefaultConversionServiceKotlinTests.kt new file mode 100644 index 0000000000..ac37a4a55c --- /dev/null +++ b/spring-core/src/test/kotlin/org/springframework/core/convert/support/DefaultConversionServiceKotlinTests.kt @@ -0,0 +1,34 @@ +package org.springframework.core.convert.support + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +/** + * Tests for Kotlin support in [DefaultConversionService]. + * + * @author Stephane Nicoll + */ +class DefaultConversionServiceKotlinTests { + + private val conversionService = DefaultConversionService() + + @Test + fun stringToRegexEmptyString() { + assertThat(conversionService.convert("", Regex::class.java)).isNull(); + } + + @Test + fun stringToRegex() { + val pattern = "\\w+" + assertThat(conversionService.convert(pattern, Regex::class.java)).isInstanceOfSatisfying( + Regex::class.java + ) { regex -> assertThat(regex.pattern).isEqualTo(pattern) } + } + + @Test + fun regexToString() { + val pattern = "\\w+" + assertThat(conversionService.convert(pattern.toRegex(), String::class.java)).isEqualTo(pattern) + } + +} \ No newline at end of file