Merge pull request #153 from gid79/SPR-9812
* SPR-9812: Allow 'arg-type' matches against element body Polish whitespace
This commit is contained in:
commit
e4158f91a4
|
@ -827,7 +827,11 @@ public class BeanDefinitionParserDelegate {
|
|||
// Look for arg-type match elements.
|
||||
List<Element> argTypeEles = DomUtils.getChildElementsByTagName(replacedMethodEle, ARG_TYPE_ELEMENT);
|
||||
for (Element argTypeEle : argTypeEles) {
|
||||
replaceOverride.addTypeIdentifier(argTypeEle.getAttribute(ARG_TYPE_MATCH_ATTRIBUTE));
|
||||
String match = argTypeEle.getAttribute(ARG_TYPE_MATCH_ATTRIBUTE);
|
||||
match = (StringUtils.hasText(match) ? match : DomUtils.getTextValue(argTypeEle));
|
||||
if (StringUtils.hasText(match)) {
|
||||
replaceOverride.addTypeIdentifier(match);
|
||||
}
|
||||
}
|
||||
replaceOverride.setSource(extractSource(replacedMethodEle));
|
||||
overrides.addOverride(replaceOverride);
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
*
|
||||
* Copyright 2002-2012 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -41,7 +41,7 @@ import org.springframework.beans.factory.support.MethodReplacer;
|
|||
|
||||
/**
|
||||
* Types used by {@link XmlBeanFactoryTests} and its attendant XML config files.
|
||||
*
|
||||
*
|
||||
* @author Chris Beams
|
||||
*/
|
||||
final class XmlBeanFactoryTestTypes { }
|
||||
|
@ -161,20 +161,20 @@ class SimpleConstructorArgBean {
|
|||
* @author Rod Johnson
|
||||
*/
|
||||
abstract class ConstructorInjectedOverrides {
|
||||
|
||||
|
||||
private ITestBean tb;
|
||||
|
||||
|
||||
private String setterString;
|
||||
|
||||
|
||||
public ConstructorInjectedOverrides(ITestBean tb) {
|
||||
this.tb = tb;
|
||||
}
|
||||
|
||||
|
||||
public ITestBean getTestBean() {
|
||||
return this.tb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected abstract FactoryMethods createFactoryMethods();
|
||||
|
||||
/**
|
||||
|
@ -234,7 +234,7 @@ class DerivedConstructorDependenciesBean extends ConstructorDependenciesBean {
|
|||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
interface DummyBo {
|
||||
|
@ -245,19 +245,19 @@ interface DummyBo {
|
|||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
class DummyBoImpl implements DummyBo {
|
||||
|
||||
|
||||
DummyDao dao;
|
||||
|
||||
public DummyBoImpl(DummyDao dao) {
|
||||
this.dao = dao;
|
||||
}
|
||||
|
||||
|
||||
public void something() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -267,7 +267,7 @@ class DummyBoImpl implements DummyBo {
|
|||
* @author Rod Johnson
|
||||
*/
|
||||
class DummyDao {
|
||||
|
||||
|
||||
DataSource ds;
|
||||
|
||||
public DummyDao(DataSource ds) {
|
||||
|
@ -332,7 +332,7 @@ class DummyReferencer {
|
|||
* @author Juergen Hoeller
|
||||
*/
|
||||
class FactoryMethods {
|
||||
|
||||
|
||||
public static FactoryMethods nullInstance() {
|
||||
return null;
|
||||
}
|
||||
|
@ -342,21 +342,21 @@ class FactoryMethods {
|
|||
tb.setName("defaultInstance");
|
||||
return new FactoryMethods(tb, "default", 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Note that overloaded methods are supported.
|
||||
*/
|
||||
public static FactoryMethods newInstance(TestBean tb) {
|
||||
return new FactoryMethods(tb, "default", 0);
|
||||
}
|
||||
|
||||
|
||||
protected static FactoryMethods newInstance(TestBean tb, int num, String name) {
|
||||
if (name == null) {
|
||||
throw new IllegalStateException("Should never be called with null value");
|
||||
}
|
||||
return new FactoryMethods(tb, name, num);
|
||||
}
|
||||
|
||||
|
||||
static FactoryMethods newInstance(TestBean tb, int num, Integer something) {
|
||||
if (something != null) {
|
||||
throw new IllegalStateException("Should never be called with non-null value");
|
||||
|
@ -384,35 +384,35 @@ class FactoryMethods {
|
|||
this.name = name;
|
||||
this.num = num;
|
||||
}
|
||||
|
||||
|
||||
public void setStringValue(String stringValue) {
|
||||
this.stringValue = stringValue;
|
||||
}
|
||||
|
||||
|
||||
public String getStringValue() {
|
||||
return this.stringValue;
|
||||
}
|
||||
|
||||
|
||||
public TestBean getTestBean() {
|
||||
return this.tb;
|
||||
}
|
||||
|
||||
|
||||
protected TestBean protectedGetTestBean() {
|
||||
return this.tb;
|
||||
}
|
||||
|
||||
|
||||
private TestBean privateGetTestBean() {
|
||||
return this.tb;
|
||||
}
|
||||
|
||||
|
||||
public int getNum() {
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set via Setter Injection once instance is created.
|
||||
*/
|
||||
|
@ -540,6 +540,9 @@ abstract class OverrideOneMethod extends MethodReplaceCandidate implements Overr
|
|||
return "replaceMe:" + someParam;
|
||||
}
|
||||
|
||||
public String replaceMe(String someParam) {
|
||||
return "replaceMe:" + someParam;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -550,7 +553,7 @@ abstract class OverrideOneMethod extends MethodReplaceCandidate implements Overr
|
|||
* @author Rod Johnson
|
||||
*/
|
||||
abstract class OverrideOneMethodSubclass extends OverrideOneMethod {
|
||||
|
||||
|
||||
protected void doSomething(String arg) {
|
||||
// This implementation does nothing!
|
||||
// It's not overloaded
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<beans>
|
||||
|
||||
<!--
|
||||
<!--
|
||||
Not yet in use: illustration of possible approach
|
||||
-->
|
||||
<bean id="overrideOneMethod" class="org.springframework.beans.factory.xml.OverrideOneMethod">
|
||||
|
||||
|
||||
<lookup-method name="getPrototypeDependency" bean="jenny"/>
|
||||
|
||||
|
||||
<lookup-method name="protectedOverrideSingleton" bean="david"/>
|
||||
|
||||
|
||||
<!-- Arbitrary method replacer -->
|
||||
<replaced-method name="replaceMe" replacer="reverseReplacer">
|
||||
<arg-type>String</arg-type>
|
||||
</replaced-method>
|
||||
|
||||
|
||||
<replaced-method name="replaceMe" replacer="fixedReplacer"/>
|
||||
|
||||
</bean>
|
||||
|
@ -39,25 +39,25 @@
|
|||
|
||||
</bean>
|
||||
|
||||
<bean id="reverseReplacer"
|
||||
<bean id="reverseReplacer"
|
||||
class="org.springframework.beans.factory.xml.ReverseMethodReplacer"/>
|
||||
|
||||
<bean id="fixedReplacer"
|
||||
|
||||
<bean id="fixedReplacer"
|
||||
class="org.springframework.beans.factory.xml.FixedMethodReplacer"/>
|
||||
|
||||
<bean id="doSomethingReplacer"
|
||||
|
||||
<bean id="doSomethingReplacer"
|
||||
class="org.springframework.beans.factory.xml.XmlBeanFactoryTests$DoSomethingReplacer"/>
|
||||
|
||||
<bean id="serializableReplacer"
|
||||
<bean id="serializableReplacer"
|
||||
class="org.springframework.beans.factory.xml.SerializableMethodReplacerCandidate">
|
||||
|
||||
|
||||
<!-- Arbitrary method replacer -->
|
||||
<replaced-method name="replaceMe" replacer="reverseReplacer">
|
||||
<arg-type>String</arg-type>
|
||||
</replaced-method>
|
||||
|
||||
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="jenny" class="org.springframework.beans.TestBean"
|
||||
scope="prototype">
|
||||
<property name="name"><value>Jenny</value></property>
|
||||
|
@ -67,7 +67,7 @@
|
|||
<ref local="david"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="david" class="org.springframework.beans.TestBean"
|
||||
scope="singleton">
|
||||
<description>
|
||||
|
@ -80,4 +80,16 @@
|
|||
<property name="age"><value>27</value></property>
|
||||
</bean>
|
||||
|
||||
<bean id="overrideOneMethodByAttribute" class="org.springframework.beans.factory.xml.OverrideOneMethod">
|
||||
<replaced-method name="replaceMe" replacer="reverseReplacer">
|
||||
<arg-type match="String"/>
|
||||
</replaced-method>
|
||||
</bean>
|
||||
|
||||
<bean id="overrideOneMethodByElement" class="org.springframework.beans.factory.xml.OverrideOneMethod">
|
||||
<replaced-method name="replaceMe" replacer="reverseReplacer">
|
||||
<arg-type>String</arg-type>
|
||||
</replaced-method>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
* Copyright 2002-2012 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.
|
||||
|
@ -83,10 +83,10 @@ import org.xml.sax.InputSource;
|
|||
* @author Chris Beams
|
||||
*/
|
||||
public final class XmlBeanFactoryTests {
|
||||
|
||||
|
||||
private static final Class<?> CLASS = XmlBeanFactoryTests.class;
|
||||
private static final String CLASSNAME = CLASS.getSimpleName();
|
||||
|
||||
|
||||
private static final ClassPathResource AUTOWIRE_CONTEXT = classPathResource("-autowire.xml");
|
||||
private static final ClassPathResource CHILD_CONTEXT = classPathResource("-child.xml");
|
||||
private static final ClassPathResource CLASS_NOT_FOUND_CONTEXT = classPathResource("-classNotFound.xml");
|
||||
|
@ -128,7 +128,7 @@ public final class XmlBeanFactoryTests {
|
|||
private static final ClassPathResource REFTYPES_CONTEXT = classPathResource("-reftypes.xml");
|
||||
private static final ClassPathResource DEFAULT_LAZY_CONTEXT = classPathResource("-defaultLazyInit.xml");
|
||||
private static final ClassPathResource DEFAULT_AUTOWIRE_CONTEXT = classPathResource("-defaultAutowire.xml");
|
||||
|
||||
|
||||
private static ClassPathResource classPathResource(String suffix) {
|
||||
return new ClassPathResource(CLASSNAME + suffix, CLASS);
|
||||
}
|
||||
|
@ -1489,6 +1489,24 @@ public final class XmlBeanFactoryTests {
|
|||
}
|
||||
}
|
||||
|
||||
public @Test void testOverrideMethodByArgTypeAttribute() {
|
||||
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
|
||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
|
||||
reader.loadBeanDefinitions(DELEGATION_OVERRIDES_CONTEXT);
|
||||
OverrideOneMethod oom = (OverrideOneMethod) xbf.getBean("overrideOneMethodByAttribute");
|
||||
assertEquals("should not replace", "replaceMe:1", oom.replaceMe(1));
|
||||
assertEquals("should replace", "cba", oom.replaceMe("abc"));
|
||||
}
|
||||
|
||||
public @Test void testOverrideMethodByArgTypeElement() {
|
||||
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
|
||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
|
||||
reader.loadBeanDefinitions(DELEGATION_OVERRIDES_CONTEXT);
|
||||
OverrideOneMethod oom = (OverrideOneMethod) xbf.getBean("overrideOneMethodByElement");
|
||||
assertEquals("should not replace", "replaceMe:1", oom.replaceMe(1));
|
||||
assertEquals("should replace", "cba", oom.replaceMe("abc"));
|
||||
}
|
||||
|
||||
public static class DoSomethingReplacer implements MethodReplacer {
|
||||
|
||||
public Object lastArg;
|
||||
|
|
Loading…
Reference in New Issue