diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java index 99842869da..4517ad8862 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/IntegrationNamespaceUtils.java @@ -37,6 +37,7 @@ import org.springframework.util.xml.DomUtils; * @author Mark Fisher * @author Marius Bogoevici * @author Alex Peters + * @author Oleg Zhurakousky */ public abstract class IntegrationNamespaceUtils { @@ -189,7 +190,9 @@ public abstract class IntegrationNamespaceUtils { if (childElements != null && childElements.size() == 1){ Element beanElement = childElements.get(0); BeanDefinitionParserDelegate delegate = parserContext.getDelegate(); - innerDefinition = delegate.parseBeanDefinitionElement(beanElement).getBeanDefinition(); + BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(beanElement); + bdHolder = delegate.decorateBeanDefinitionIfRequired(beanElement, bdHolder); + innerDefinition = bdHolder.getBeanDefinition(); } String ref = element.getAttribute(REF_ATTRIBUTE); diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest-context.xml new file mode 100644 index 0000000000..81f02dc9fa --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest-context.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java new file mode 100644 index 0000000000..82c2350277 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/PNamespaceTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2002-2008 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. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.config.xml; + +import junit.framework.Assert; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.integration.endpoint.EventDrivenConsumer; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Validates the "p:namespace" is working for inner "bean" definition within SI components. + * + * @author Oleg Zhurakousky + * + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class PNamespaceTest { + @Autowired + @Qualifier("sa") + EventDrivenConsumer serviceActivator; + @Autowired + @Qualifier("sp") + EventDrivenConsumer splitter; + @Autowired + @Qualifier("rt") + EventDrivenConsumer router; + @Autowired + @Qualifier("tr") + EventDrivenConsumer transformer; + + @Test + public void testPNamespaceServiceActivator(){ + TestBean bean = prepare(serviceActivator); + + Assert.assertEquals("paris", bean.getFname()); + Assert.assertEquals("hilton", bean.getLname()); + } + @Test + public void testPNamespaceSplitter(){ + TestBean bean = prepare(splitter); + + Assert.assertEquals("paris", bean.getFname()); + Assert.assertEquals("hilton", bean.getLname()); + } + @Test + public void testPNamespaceRouter(){ + TestBean bean = prepare(router); + + Assert.assertEquals("paris", bean.getFname()); + Assert.assertEquals("hilton", bean.getLname()); + } + @Test + public void testPNamespaceTransformer(){ + TestBean bean = prepare(transformer); + + Assert.assertEquals("paris", bean.getFname()); + Assert.assertEquals("hilton", bean.getLname()); + } + + private TestBean prepare(EventDrivenConsumer edc){ + DirectFieldAccessor saAccessor = new DirectFieldAccessor(serviceActivator); + Object handler = saAccessor.getPropertyValue("handler"); + DirectFieldAccessor hAccessor = new DirectFieldAccessor(handler); + Object invoker = hAccessor.getPropertyValue("invoker"); + DirectFieldAccessor iAccessor = new DirectFieldAccessor(invoker); + return (TestBean) iAccessor.getPropertyValue("object"); + } + + public interface InboundGateway{ + public String echo(); + } + + public static class TestBean{ + private String fname; + private String lname; + public String getFname() { + return fname; + } + public void setFname(String fname) { + this.fname = fname; + } + public String getLname() { + return lname; + } + public void setLname(String lname) { + this.lname = lname; + } + + public String printWithPrefix(String prefix){ + return prefix + fname + " " + lname; + } + public String toString(){ + return fname + lname; + } + } + +}