Fix ConfigurationPropertySources attach logic
Fix `ConfigurationPropertySources.attach` so that repeated calls to the same source no longer create a new instance. Fixes gh-29409
This commit is contained in:
		
							parent
							
								
									3f7bf7d34f
								
							
						
					
					
						commit
						79d9549805
					
				|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2012-2021 the original author or authors. |  * Copyright 2012-2022 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -87,15 +87,16 @@ public final class ConfigurationPropertySources { | ||||||
| 		Assert.isInstanceOf(ConfigurableEnvironment.class, environment); | 		Assert.isInstanceOf(ConfigurableEnvironment.class, environment); | ||||||
| 		MutablePropertySources sources = ((ConfigurableEnvironment) environment).getPropertySources(); | 		MutablePropertySources sources = ((ConfigurableEnvironment) environment).getPropertySources(); | ||||||
| 		PropertySource<?> attached = getAttached(sources); | 		PropertySource<?> attached = getAttached(sources); | ||||||
| 		if (attached != null && attached.getSource() != sources) { | 		if (attached != null) { | ||||||
| 			sources.remove(ATTACHED_PROPERTY_SOURCE_NAME); | 			if (attached instanceof ConfigurationPropertySourcesPropertySource | ||||||
| 			attached = null; | 					&& ((SpringConfigurationPropertySources) attached.getSource()).isUsingSources(sources)) { | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			sources.remove(ATTACHED_PROPERTY_SOURCE_NAME); | ||||||
| 		} | 		} | ||||||
| 		if (attached == null) { |  | ||||||
| 		sources.addFirst(new ConfigurationPropertySourcesPropertySource(ATTACHED_PROPERTY_SOURCE_NAME, | 		sources.addFirst(new ConfigurationPropertySourcesPropertySource(ATTACHED_PROPERTY_SOURCE_NAME, | ||||||
| 				new SpringConfigurationPropertySources(sources))); | 				new SpringConfigurationPropertySources(sources))); | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	static PropertySource<?> getAttached(MutablePropertySources sources) { | 	static PropertySource<?> getAttached(MutablePropertySources sources) { | ||||||
| 		return (sources != null) ? sources.get(ATTACHED_PROPERTY_SOURCE_NAME) : null; | 		return (sources != null) ? sources.get(ATTACHED_PROPERTY_SOURCE_NAME) : null; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2012-2020 the original author or authors. |  * Copyright 2012-2022 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -71,6 +71,19 @@ class ConfigurationPropertySourcesTests { | ||||||
| 		assertThat(child.getProperty("my.example-property")).isEqualTo("1234"); | 		assertThat(child.getProperty("my.example-property")).isEqualTo("1234"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void attachWhenAlreadyAttachedWithSameSourcesShouldReturnExistingInstance() { | ||||||
|  | 		ConfigurableEnvironment environment = new StandardEnvironment(); | ||||||
|  | 		MutablePropertySources sources = environment.getPropertySources(); | ||||||
|  | 		sources.addLast(new SystemEnvironmentPropertySource("system", Collections.singletonMap("SERVER_PORT", "1234"))); | ||||||
|  | 		sources.addLast(new MapPropertySource("config", Collections.singletonMap("server.port", "4568"))); | ||||||
|  | 		ConfigurationPropertySources.attach(environment); | ||||||
|  | 		Iterable<ConfigurationPropertySource> first = ConfigurationPropertySources.get(environment); | ||||||
|  | 		ConfigurationPropertySources.attach(environment); | ||||||
|  | 		Iterable<ConfigurationPropertySource> second = ConfigurationPropertySources.get(environment); | ||||||
|  | 		assertThat(first).isSameAs(second); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	void getWhenNotAttachedShouldReturnAdapted() { | 	void getWhenNotAttachedShouldReturnAdapted() { | ||||||
| 		ConfigurableEnvironment environment = new StandardEnvironment(); | 		ConfigurableEnvironment environment = new StandardEnvironment(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue