/*
* Copyright 2002-2016 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.InputStreamResource;
import org.springframework.integration.IntegrationMessageHeaderAccessor;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.endpoint.EventDrivenConsumer;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.PollableChannel;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
/**
* @author Oleg Zhurakousky
* @author Gunnar Hillert
* @author Gary Russell
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class InnerDefinitionHandlerAwareEndpointParserTests {
@Autowired
private Properties testConfigurations;
@Test
public void testInnerSplitterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("splitter-inner-success");
this.testSplitterDefinitionSuccess(configProperty);
}
@Test
public void testInnerSplitterDefinitionSuccessWithPoller() {
String configProperty = testConfigurations.getProperty("splitter-inner-success-with-poller");
this.bootStrap(configProperty);
}
@Test
public void testInnerSplitterDefinitionSuccessWithPollerReversedOrder() {
String configProperty = testConfigurations.getProperty("splitter-inner-success-with-poller-reversed-order");
this.bootStrap(configProperty);
}
@Test
public void testRefSplitterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("splitter-ref-success");
this.testSplitterDefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerSplitterDefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("splitter-failure-refAndBean");
this.bootStrap(xmlConfig);
}
@Test
public void testInnerTransformerDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("transformer-inner-success");
this.testTransformerDefinitionSuccess(configProperty);
}
@Test
public void testRefTransformerDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("transformer-ref-success");
this.testTransformerDefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerTransformerDefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("transformer-failure-refAndBean");
this.bootStrap(xmlConfig);
}
@Test
public void testInnerRouterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("router-inner-success");
this.testRouterDefinitionSuccess(configProperty);
}
@Test
public void testRefRouterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("router-ref-success");
this.testRouterDefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerRouterDefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("router-failure-refAndBean");
this.bootStrap(xmlConfig);
}
@Test
public void testInnerSADefinitionSuccess() {
String configProperty = testConfigurations.getProperty("sa-inner-success");
this.testSADefinitionSuccess(configProperty);
}
@Test
public void testRefSADefinitionSuccess() {
String configProperty = testConfigurations.getProperty("sa-ref-success");
this.testSADefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerSADefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("sa-failure-refAndBean");
this.bootStrap(xmlConfig);
}
@Test
public void testInnerAggregatorDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("aggregator-inner-success");
this.testAggregatorDefinitionSuccess(configProperty);
}
@Test
public void testInnerConcurrentAggregatorDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("aggregator-inner-concurrent-success");
this.testAggregatorDefinitionSuccess(configProperty);
}
@Test
public void testInnerConcurrentAggregatorDefinitionSuccessReorderBeanPoller() {
String configProperty = testConfigurations.getProperty("aggregator-inner-concurrent-success-reorder-bean-poller");
this.testAggregatorDefinitionSuccess(configProperty);
}
@Test
public void testRefAggregatorDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("aggregator-ref-success");
this.testAggregatorDefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerAggregatorDefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("aggregator-failure-refAndBean");
this.bootStrap(xmlConfig);
}
@Test
public void testInnerFilterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("filter-inner-success");
this.testFilterDefinitionSuccess(configProperty);
}
@Test
public void testRefFilterDefinitionSuccess() {
String configProperty = testConfigurations.getProperty("filter-ref-success");
this.testFilterDefinitionSuccess(configProperty);
}
@Test(expected = BeanDefinitionStoreException.class)
public void testInnerFilterDefinitionFailureRefAndInner() {
String xmlConfig = testConfigurations.getProperty("filter-failure-refAndBean");
this.bootStrap(xmlConfig);
}
private void testSplitterDefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
EventDrivenConsumer splitter = (EventDrivenConsumer) ac.getBean("testSplitter");
Assert.assertNotNull(splitter);
MessageBuilder<String[]> inChannelMessageBuilder = MessageBuilder.withPayload(new String[]{"One", "Two"});
Message<String[]> inMessage = inChannelMessageBuilder.build();
MessageChannel inChannel = (MessageChannel) ac.getBean("inChannel");
inChannel.send(inMessage);
PollableChannel outChannel = (PollableChannel) ac.getBean("outChannel");
Assert.assertTrue(outChannel.receive().getPayload() instanceof String);
outChannel = (PollableChannel) ac.getBean("outChannel");
Assert.assertTrue(outChannel.receive().getPayload() instanceof String);
}
private void testTransformerDefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
EventDrivenConsumer transformer = (EventDrivenConsumer) ac.getBean("testTransformer");
Assert.assertNotNull(transformer);
MessageBuilder<String[]> inChannelMessageBuilder = MessageBuilder.withPayload(new String[]{"One", "Two"});
Message<String[]> inMessage = inChannelMessageBuilder.build();
DirectChannel inChannel = (DirectChannel) ac.getBean("inChannel");
inChannel.send(inMessage);
PollableChannel outChannel = (PollableChannel) ac.getBean("outChannel");
String payload = (String) outChannel.receive().getPayload();
Assert.assertTrue(payload.equals("One,Two"));
}
private void testRouterDefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
EventDrivenConsumer splitter = (EventDrivenConsumer) ac.getBean("testRouter");
Assert.assertNotNull(splitter);
MessageBuilder<String> inChannelMessageBuilder = MessageBuilder.withPayload("1");
Message<String> inMessage = inChannelMessageBuilder.build();
DirectChannel inChannel = (DirectChannel) ac.getBean("inChannel");
inChannel.send(inMessage);
PollableChannel channel1 = (PollableChannel) ac.getBean("channel1");
Assert.assertTrue(channel1.receive().getPayload().equals("1"));
inChannelMessageBuilder = MessageBuilder.withPayload("2");
inMessage = inChannelMessageBuilder.build();
inChannel.send(inMessage);
PollableChannel channel2 = (PollableChannel) ac.getBean("channel2");
Assert.assertTrue(channel2.receive().getPayload().equals("2"));
}
private void testSADefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
EventDrivenConsumer splitter = (EventDrivenConsumer) ac.getBean("testServiceActivator");
Assert.assertNotNull(splitter);
MessageBuilder<String> inChannelMessageBuilder = MessageBuilder.withPayload("1");
Message<String> inMessage = inChannelMessageBuilder.build();
DirectChannel inChannel = (DirectChannel) ac.getBean("inChannel");
inChannel.send(inMessage);
PollableChannel channel1 = (PollableChannel) ac.getBean("outChannel");
Assert.assertTrue(channel1.receive().getPayload().equals("1"));
}
private void testAggregatorDefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
MessageChannel inChannel = (MessageChannel) ac.getBean("inChannel");
for (int i = 0; i < 5; i++) {
Map<String, Object> headers = stubHeaders(i, 5, 1);
Message<Integer> message = MessageBuilder.withPayload(i).copyHeaders(headers).build();
inChannel.send(message);
}
PollableChannel output = (PollableChannel) ac.getBean("outChannel");
Message<?> receivedMessage = output.receive(10000);
assertNotNull(receivedMessage);
assertEquals(0 + 1 + 2 + 3 + 4, receivedMessage.getPayload());
}
private void testFilterDefinitionSuccess(String configProperty) {
ApplicationContext ac = this.bootStrap(configProperty);
MessageChannel input = (MessageChannel) ac.getBean("inChannel");
PollableChannel output = (PollableChannel) ac.getBean("outChannel");
input.send(new GenericMessage<String>("foo"));
Message<?> reply = output.receive(0);
assertEquals("foo", reply.getPayload());
}
private ApplicationContext bootStrap(String configProperty) {
ByteArrayInputStream stream = new ByteArrayInputStream(configProperty.getBytes());
GenericApplicationContext ac = new GenericApplicationContext();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(ac);
reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD);
reader.loadBeanDefinitions(new InputStreamResource(stream));
ac.refresh();
return ac;
}
private Map<String, Object> stubHeaders(int sequenceNumber, int sequenceSize, int correllationId) {
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER, sequenceNumber);
headers.put(IntegrationMessageHeaderAccessor.SEQUENCE_SIZE, sequenceSize);
headers.put(IntegrationMessageHeaderAccessor.CORRELATION_ID, correllationId);
return headers;
}
@SuppressWarnings("unchecked")
public static class TestSplitter {
public Collection<String> split(String[] payload) {
return CollectionUtils.arrayToList(payload);
}
}
public static class TestTransformer {
public String split(String[] payload) {
return StringUtils.arrayToDelimitedString(payload, ",");
}
}
public static class TestRouter {
public String route(String value) {
return (value.equals("1")) ? "channel1" : "channel2";
}
}
public static class TestServiceActivator {
public String foo(String value) {
return value;
}
}
public static class TestAggregator {
public Integer sum(List<Integer> numbers) {
int result = 0;
for (Integer number : numbers) {
result += number;
}
return result;
}
}
public static class TestMessageFilter {
public boolean filter(String value) {
return value.equals("foo");
}
}
}