INT-1257, added namespace support for specifying name patterns for tracked components

This commit is contained in:
Oleg Zhurakousky
2010-08-31 19:19:16 +00:00
parent 812a8c657f
commit 3982994704
4 changed files with 88 additions and 10 deletions

View File

@@ -16,12 +16,12 @@
package org.springframework.integration.config.xml;
import org.w3c.dom.Element;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
/**
* @author Oleg Zhurakousky
@@ -49,5 +49,14 @@ public class MessageHistoryParser extends AbstractSimpleBeanDefinitionParser {
}
return CONFIGURER_CLASSNAME;
}
protected void postProcess(BeanDefinitionBuilder beanDefinition, Element element) {
}
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "tracked-components", "componentNamePatterns");
postProcess(builder, element);
}
}

View File

@@ -2454,6 +2454,17 @@ only be one Message History writer per ApplicationContext hierarchy.
]]>
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:attribute name="tracked-components" type="xsd:string" default="*">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
The list of component name patterns you want to track (e.g., tracked-components="inputChannel, out*, *Channel, *Service")
]]>
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:attributeGroup name="inputOutputChannelGroup">

View File

@@ -16,12 +16,6 @@
package org.springframework.integration.history;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
@@ -29,18 +23,23 @@ import java.util.Properties;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.Message;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.ConsumerEndpointFactoryBean;
import org.springframework.integration.core.MessageChannel;
import org.springframework.integration.core.MessageHandler;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/**
* @author Oleg Zhurakousky
*/
@@ -178,6 +177,30 @@ public class MessageHistoryIntegrationTests {
gateway.echo("hello");
Mockito.verify(handler, Mockito.times(1)).handleMessage(Mockito.any(Message.class));
}
@Test
public void testMessageHistoryParserWithNamePatterns() {
ApplicationContext ac = new ClassPathXmlApplicationContext("messageHistoryWithHistoryWriterNamespaceAndPatterns.xml", MessageHistoryIntegrationTests.class);
SampleGateway gateway = ac.getBean("sampleGateway", SampleGateway.class);
DirectChannel endOfThePipeChannel = ac.getBean("endOfThePipeChannel", DirectChannel.class);
MessageHandler handler = Mockito.spy(new MessageHandler() {
public void handleMessage(Message<?> message) {
Iterator<Properties> historyIterator = message.getHeaders().get(MessageHistory.HEADER_NAME, MessageHistory.class).iterator();
assertTrue(historyIterator.hasNext());
Properties gatewayHistory = historyIterator.next();
assertEquals("sampleGateway", gatewayHistory.get("name"));
assertTrue(historyIterator.hasNext());
Properties chainHistory = historyIterator.next();
assertEquals("sampleChain", chainHistory.get("name"));
assertFalse(historyIterator.hasNext());
MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel();
replyChannel.send(message);
}
});
endOfThePipeChannel.subscribe(handler);
gateway.echo("hello");
Mockito.verify(handler, Mockito.times(1)).handleMessage(Mockito.any(Message.class));
}
@Test(expected=BeanDefinitionParsingException.class)
public void testMessageHistoryMoreThanOneNamespaceFail() {

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd">
<int:gateway id="sampleGateway"
service-interface="org.springframework.integration.history.MessageHistoryIntegrationTests.SampleGateway"
default-request-channel="bridgeInChannel"/>
<int:bridge id="testBridge" input-channel="bridgeInChannel" output-channel="headerEnricherChannel"/>
<int:header-enricher id="testHeaderEnricher" input-channel="headerEnricherChannel" output-channel="chainChannel">
<int:header name="foo" value="foo"/>
</int:header-enricher>
<int:chain id="sampleChain" input-channel="chainChannel" output-channel="filterChannel">
<int:header-enricher>
<int:header name="baz" value="baz"/>
</int:header-enricher>
</int:chain>
<int:filter id="testFilter" input-channel="filterChannel"
output-channel="splitterChannel" expression="payload.equals('hello')"/>
<int:splitter id="testSplitter" input-channel="splitterChannel" output-channel="aggregatorChannel"/>
<int:aggregator id="testAggregator" input-channel="aggregatorChannel" output-channel="endOfThePipeChannel"/>
<int:channel id="endOfThePipeChannel"/>
<int:message-history tracked-components="*Gateway, sample*"/>
</beans>