From a29253f2ca81375707734b89f279b3270aba1544 Mon Sep 17 00:00:00 2001 From: David Syer Date: Tue, 27 Oct 2009 13:38:29 +0000 Subject: [PATCH] RESOLVED - issue SPR-4661: Improve context-property-placeholder configurability Added new features to property override and placeholders (order, locations, system-properties-mode, ignore-*) --- ...ctPropertyLoadingBeanDefinitionParser.java | 19 ++ .../PropertyOverrideBeanDefinitionParser.java | 11 + ...opertyPlaceholderBeanDefinitionParser.java | 18 ++ .../context/config/spring-context-3.0.xsd | 212 ++++++++++++------ .../config/ContextNamespaceHandlerTests.java | 67 +++++- .../contextNamespaceHandlerTests-location.xml | 24 ++ .../contextNamespaceHandlerTests-override.xml | 20 ++ ...xtNamespaceHandlerTests-replace-ignore.xml | 18 ++ ... contextNamespaceHandlerTests-replace.xml} | 19 +- .../contextNamespaceHandlerTests-system.xml | 19 ++ .../context/config/empty-foo.properties | 1 + .../context/config/test-bar.properties | 2 + .../context/config/test-foo.properties | 1 + 13 files changed, 338 insertions(+), 93 deletions(-) create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-location.xml create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-override.xml create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace-ignore.xml rename org.springframework.context/src/test/resources/org/springframework/context/config/{contextNamespaceHandlerTests.xml => contextNamespaceHandlerTests-replace.xml} (73%) create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-system.xml create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/empty-foo.properties create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/test-bar.properties create mode 100644 org.springframework.context/src/test/resources/org/springframework/context/config/test-foo.properties diff --git a/org.springframework.context/src/main/java/org/springframework/context/config/AbstractPropertyLoadingBeanDefinitionParser.java b/org.springframework.context/src/main/java/org/springframework/context/config/AbstractPropertyLoadingBeanDefinitionParser.java index 3e4f64d9899..5476b2136f6 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/config/AbstractPropertyLoadingBeanDefinitionParser.java +++ b/org.springframework.context/src/main/java/org/springframework/context/config/AbstractPropertyLoadingBeanDefinitionParser.java @@ -28,6 +28,7 @@ import org.springframework.util.StringUtils; * * @author Juergen Hoeller * @author Arjen Poutsma + * @author Dave Syer * @since 2.5.2 */ abstract class AbstractPropertyLoadingBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @@ -44,10 +45,28 @@ abstract class AbstractPropertyLoadingBeanDefinitionParser extends AbstractSingl String[] locations = StringUtils.commaDelimitedListToStringArray(location); builder.addPropertyValue("locations", locations); } + String propertiesRef = element.getAttribute("properties-ref"); if (StringUtils.hasLength(propertiesRef)) { builder.addPropertyReference("properties", propertiesRef); } + + String fileEncoding = element.getAttribute("file-encoding"); + if (StringUtils.hasLength(fileEncoding)) { + builder.addPropertyReference("fileEncoding", fileEncoding); + } + + String order = element.getAttribute("order"); + if (StringUtils.hasLength(order)) { + builder.addPropertyValue("order", Integer.valueOf(order)); + } + + builder.addPropertyValue("ignoreResourceNotFound", + Boolean.valueOf(element.getAttribute("ignore-resource-not-found"))); + + builder.addPropertyValue("localOverride", + Boolean.valueOf(element.getAttribute("local-override"))); + builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); } diff --git a/org.springframework.context/src/main/java/org/springframework/context/config/PropertyOverrideBeanDefinitionParser.java b/org.springframework.context/src/main/java/org/springframework/context/config/PropertyOverrideBeanDefinitionParser.java index 6623cf044c2..d48ad706b86 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/config/PropertyOverrideBeanDefinitionParser.java +++ b/org.springframework.context/src/main/java/org/springframework/context/config/PropertyOverrideBeanDefinitionParser.java @@ -19,11 +19,13 @@ package org.springframework.context.config; import org.w3c.dom.Element; import org.springframework.beans.factory.config.PropertyOverrideConfigurer; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; /** * Parser for the <context:property-override/> element. * * @author Juergen Hoeller + * @author Dave Syer * @since 2.5.2 */ class PropertyOverrideBeanDefinitionParser extends AbstractPropertyLoadingBeanDefinitionParser { @@ -32,5 +34,14 @@ class PropertyOverrideBeanDefinitionParser extends AbstractPropertyLoadingBeanDe protected Class getBeanClass(Element element) { return PropertyOverrideConfigurer.class; } + + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + + super.doParse(element, builder); + builder.addPropertyValue("ignoreInvalidKeys", + Boolean.valueOf(element.getAttribute("ignore-unresolvable"))); + + } } \ No newline at end of file diff --git a/org.springframework.context/src/main/java/org/springframework/context/config/PropertyPlaceholderBeanDefinitionParser.java b/org.springframework.context/src/main/java/org/springframework/context/config/PropertyPlaceholderBeanDefinitionParser.java index 3d5e8986215..234c1d01434 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/config/PropertyPlaceholderBeanDefinitionParser.java +++ b/org.springframework.context/src/main/java/org/springframework/context/config/PropertyPlaceholderBeanDefinitionParser.java @@ -19,11 +19,14 @@ package org.springframework.context.config; import org.w3c.dom.Element; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.util.StringUtils; /** * Parser for the <context:property-placeholder/> element. * * @author Juergen Hoeller + * @author Dave Syer * @since 2.5 */ class PropertyPlaceholderBeanDefinitionParser extends AbstractPropertyLoadingBeanDefinitionParser { @@ -32,5 +35,20 @@ class PropertyPlaceholderBeanDefinitionParser extends AbstractPropertyLoadingBea protected Class getBeanClass(Element element) { return PropertyPlaceholderConfigurer.class; } + + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + + super.doParse(element, builder); + + builder.addPropertyValue("ignoreUnresolvablePlaceholders", + Boolean.valueOf(element.getAttribute("ignore-unresolvable"))); + + String systemPropertiesModeName = element.getAttribute("system-properties-mode"); + if (StringUtils.hasLength(systemPropertiesModeName)) { + builder.addPropertyValue("systemPropertiesModeName", "SYSTEM_PROPERTIES_MODE_"+systemPropertiesModeName); + } + + } } diff --git a/org.springframework.context/src/main/resources/org/springframework/context/config/spring-context-3.0.xsd b/org.springframework.context/src/main/resources/org/springframework/context/config/spring-context-3.0.xsd index 7a93ad49b24..dd8f18dbeed 100644 --- a/org.springframework.context/src/main/resources/org/springframework/context/config/spring-context-3.0.xsd +++ b/org.springframework.context/src/main/resources/org/springframework/context/config/spring-context-3.0.xsd @@ -1,13 +1,15 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + + + + + @@ -60,27 +127,15 @@ ]]> - + - - - - - - - - - - + + + @@ -123,14 +178,16 @@ - + - + - + - + - + - - + + @@ -188,8 +249,9 @@ ]]> - - + + @@ -203,9 +265,9 @@ - - - + + + @@ -238,7 +300,8 @@ ]]> - + @@ -250,8 +313,9 @@ ]]> - - + + @@ -290,7 +354,8 @@ - + - + - - + @@ -346,9 +413,9 @@ - - - + + + @@ -357,7 +424,8 @@ - - + @@ -403,11 +471,11 @@ - - - - - + + + + + diff --git a/org.springframework.context/src/test/java/org/springframework/context/config/ContextNamespaceHandlerTests.java b/org.springframework.context/src/test/java/org/springframework/context/config/ContextNamespaceHandlerTests.java index 9c33a6a39cf..c34c3f58850 100644 --- a/org.springframework.context/src/test/java/org/springframework/context/config/ContextNamespaceHandlerTests.java +++ b/org.springframework.context/src/test/java/org/springframework/context/config/ContextNamespaceHandlerTests.java @@ -16,6 +16,7 @@ package org.springframework.context.config; +import java.util.Calendar; import java.util.Date; import java.util.Map; @@ -31,30 +32,76 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author Arjen Poutsma + * @author Dave Syer * @since 2.5.6 */ public class ContextNamespaceHandlerTests { - private ApplicationContext applicationContext; - - @Before - public void createAppContext() { - applicationContext = new ClassPathXmlApplicationContext("contextNamespaceHandlerTests.xml", getClass()); - } - @Test public void propertyPlaceholder() throws Exception { - Map beans = applicationContext.getBeansOfType(PropertyPlaceholderConfigurer.class); + ApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "contextNamespaceHandlerTests-replace.xml", getClass()); + Map beans = applicationContext + .getBeansOfType(PropertyPlaceholderConfigurer.class); assertFalse("No PropertyPlaceHolderConfigurer found", beans.isEmpty()); String s = (String) applicationContext.getBean("string"); assertEquals("No properties replaced", "bar", s); } + @Test + public void propertyPlaceholderSystemProperties() throws Exception { + String value = System.setProperty("foo", "spam"); + try { + ApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "contextNamespaceHandlerTests-system.xml", getClass()); + Map beans = applicationContext + .getBeansOfType(PropertyPlaceholderConfigurer.class); + assertFalse("No PropertyPlaceHolderConfigurer found", beans.isEmpty()); + String s = (String) applicationContext.getBean("string"); + assertEquals("No properties replaced", "spam", s); + } finally { + if (value!=null) { + System.setProperty("foo", value); + } + } + } + + @Test + public void propertyPlaceholderLocation() throws Exception { + ApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "contextNamespaceHandlerTests-location.xml", getClass()); + Map beans = applicationContext + .getBeansOfType(PropertyPlaceholderConfigurer.class); + assertFalse("No PropertyPlaceHolderConfigurer found", beans.isEmpty()); + String s = (String) applicationContext.getBean("foo"); + assertEquals("No properties replaced", "bar", s); + s = (String) applicationContext.getBean("bar"); + assertEquals("No properties replaced", "foo", s); + s = (String) applicationContext.getBean("spam"); + assertEquals("No properties replaced", "maps", s); + } + + @Test + public void propertyPlaceholderIgnored() throws Exception { + ApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "contextNamespaceHandlerTests-replace-ignore.xml", getClass()); + Map beans = applicationContext + .getBeansOfType(PropertyPlaceholderConfigurer.class); + assertFalse("No PropertyPlaceHolderConfigurer found", beans.isEmpty()); + String s = (String) applicationContext.getBean("string"); + assertEquals("Properties replaced", "${bar}", s); + } + @Test public void propertyOverride() throws Exception { - Map beans = applicationContext.getBeansOfType(PropertyOverrideConfigurer.class); + ApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "contextNamespaceHandlerTests-override.xml", getClass()); + Map beans = applicationContext + .getBeansOfType(PropertyOverrideConfigurer.class); assertFalse("No PropertyOverrideConfigurer found", beans.isEmpty()); Date date = (Date) applicationContext.getBean("date"); - assertEquals("No properties overriden", 42, date.getMinutes()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + assertEquals("No properties overriden", 42, calendar.get(Calendar.MINUTE)); } } diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-location.xml b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-location.xml new file mode 100644 index 00000000000..d2f776bb56a --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-location.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-override.xml b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-override.xml new file mode 100644 index 00000000000..571397bd6e0 --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-override.xml @@ -0,0 +1,20 @@ + + + + + 42 + + + + + + + + + + + diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace-ignore.xml b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace-ignore.xml new file mode 100644 index 00000000000..727c03198d9 --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace-ignore.xml @@ -0,0 +1,18 @@ + + + + + bar + + + + + + + + + diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests.xml b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace.xml similarity index 73% rename from org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests.xml rename to org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace.xml index c0b09682602..286cff23d92 100644 --- a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests.xml +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-replace.xml @@ -2,26 +2,23 @@ bar - + + + + + + + - - 42 - - - - - - - diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-system.xml b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-system.xml new file mode 100644 index 00000000000..9c475282fc0 --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/contextNamespaceHandlerTests-system.xml @@ -0,0 +1,19 @@ + + + + + bar + + + + + + + + + diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/empty-foo.properties b/org.springframework.context/src/test/resources/org/springframework/context/config/empty-foo.properties new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/empty-foo.properties @@ -0,0 +1 @@ + diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/test-bar.properties b/org.springframework.context/src/test/resources/org/springframework/context/config/test-bar.properties new file mode 100644 index 00000000000..b0e291695e7 --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/test-bar.properties @@ -0,0 +1,2 @@ +bar=foo +spam=maps diff --git a/org.springframework.context/src/test/resources/org/springframework/context/config/test-foo.properties b/org.springframework.context/src/test/resources/org/springframework/context/config/test-foo.properties new file mode 100644 index 00000000000..74d0a43fccf --- /dev/null +++ b/org.springframework.context/src/test/resources/org/springframework/context/config/test-foo.properties @@ -0,0 +1 @@ +foo=bar