From a7a29a82265f54e61d38d9622051bb4726227623 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Thu, 31 May 2018 12:17:37 +0200 Subject: [PATCH] Revisit PropertyResolver Kotlin extensions Issue: SPR-16883 --- .../context/support/BeanDefinitionDslTests.kt | 4 +-- .../core/env/PropertyResolverExtensions.kt | 32 ++++++++++++++++--- .../env/PropertyResolverExtensionsTests.kt | 25 ++++++++++++--- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt b/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt index 338cd20d907..1bc94b9f79c 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt @@ -82,7 +82,7 @@ class BeanDefinitionDslTests { val beans = beans { bean() bean("bar") - bean { FooFoo(env["name"]) } + bean { FooFoo(env["name"]!!) } environment( { activeProfiles.contains("baz") } ) { bean { Baz(ref()) } bean { Baz(ref("bar")) } @@ -109,7 +109,7 @@ class BeanDefinitionDslTests { @Test // SPR-16412 fun `Declare beans depending on environment properties`() { val beans = beans { - val n = env["number-of-beans"].toInt() + val n = env["number-of-beans"]!!.toInt() for (i in 1..n) { bean("string$i") { Foo() } } diff --git a/spring-core/src/main/kotlin/org/springframework/core/env/PropertyResolverExtensions.kt b/spring-core/src/main/kotlin/org/springframework/core/env/PropertyResolverExtensions.kt index b58dec0641c..5ff143f79ba 100644 --- a/spring-core/src/main/kotlin/org/springframework/core/env/PropertyResolverExtensions.kt +++ b/spring-core/src/main/kotlin/org/springframework/core/env/PropertyResolverExtensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -14,16 +14,40 @@ * limitations under the License. */ +@file:Suppress("EXTENSION_SHADOWED_BY_MEMBER") + package org.springframework.core.env /** - * Extension for [PropertyResolver.getRequiredProperty] providing Array like getter. + * Extension for [PropertyResolver.getProperty] providing Array like getter returning a + * nullable [String]. * * ```kotlin - * env["name"] = "Seb" + * val name = env["name"] ?: "Seb" * ``` * * @author Sebastien Deleuze * @since 5.0 */ -operator fun PropertyResolver.get(key: String) : String = getRequiredProperty(key) +operator fun PropertyResolver.get(key: String) : String? = getProperty(key) + + +/** + * Extension for [PropertyResolver.getProperty] providing a `getProperty(...)` + * variant returning a nullable [String]. + * + * @author Sebastien Deleuze + * @since 5.1 + */ +inline fun PropertyResolver.getProperty(key: String) : T? = + getProperty(key, T::class.java) + +/** + * Extension for [PropertyResolver.getRequiredProperty] providing a + * `getRequiredProperty(...)` variant. + * + * @author Sebastien Deleuze + * @since 5.1 + */ +inline fun PropertyResolver.getRequiredProperty(key: String) : T = + getRequiredProperty(key, T::class.java) diff --git a/spring-core/src/test/kotlin/org/springframework/core/env/PropertyResolverExtensionsTests.kt b/spring-core/src/test/kotlin/org/springframework/core/env/PropertyResolverExtensionsTests.kt index aedd8a03911..fee3b1e4985 100644 --- a/spring-core/src/test/kotlin/org/springframework/core/env/PropertyResolverExtensionsTests.kt +++ b/spring-core/src/test/kotlin/org/springframework/core/env/PropertyResolverExtensionsTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -16,9 +16,12 @@ package org.springframework.core.env +import com.nhaarman.mockito_kotlin.any +import com.nhaarman.mockito_kotlin.whenever import org.junit.Test import org.junit.runner.RunWith import org.mockito.Answers +import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito import org.mockito.junit.MockitoJUnitRunner @@ -29,16 +32,30 @@ import org.mockito.junit.MockitoJUnitRunner * @author Sebastien Deleuze */ @RunWith(MockitoJUnitRunner::class) +@Suppress("UNUSED_VARIABLE") class PropertyResolverExtensionsTests { @Mock(answer = Answers.RETURNS_MOCKS) lateinit var propertyResolver: PropertyResolver - @Suppress("UNUSED_VARIABLE") @Test fun `get operator`() { - val name = propertyResolver["name"] - Mockito.verify(propertyResolver, Mockito.times(1)).getRequiredProperty("name") + val name = propertyResolver["name"] ?: "foo" + Mockito.verify(propertyResolver, Mockito.times(1)).getProperty("name") + } + + @Test + fun `getProperty extension`() { + whenever(propertyResolver.getProperty(any(), eq(String::class.java))).thenReturn("foo") + val name = propertyResolver.getProperty("name") ?: "foo" + Mockito.verify(propertyResolver, Mockito.times(1)).getProperty("name", String::class.java) + } + + @Test + fun `getRequiredProperty extension`() { + whenever(propertyResolver.getRequiredProperty(any(), eq(String::class.java))).thenReturn("foo") + val name = propertyResolver.getRequiredProperty("name") + Mockito.verify(propertyResolver, Mockito.times(1)).getRequiredProperty("name", String::class.java) } }