diff --git a/spring-integration-core/src/main/java/org/springframework/integration/channel/ExecutorChannel.java b/spring-integration-core/src/main/java/org/springframework/integration/channel/ExecutorChannel.java index f7ec4f349b..a3730f914c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/channel/ExecutorChannel.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/channel/ExecutorChannel.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * 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. @@ -101,6 +101,12 @@ public class ExecutorChannel extends AbstractExecutorChannel { @Override public final void onInit() { + try { + super.onInit(); // TODO add throws clause in 5.0 + } + catch (Exception e) { + throw new IllegalStateException(e); + } if (!(this.executor instanceof ErrorHandlingTaskExecutor)) { ErrorHandler errorHandler = new MessagePublishingErrorHandler( new BeanFactoryChannelResolver(this.getBeanFactory())); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/converter/DefaultDatatypeChannelMessageConverter.java b/spring-integration-core/src/main/java/org/springframework/integration/support/converter/DefaultDatatypeChannelMessageConverter.java index 877680a0ba..654820365e 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/converter/DefaultDatatypeChannelMessageConverter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/converter/DefaultDatatypeChannelMessageConverter.java @@ -60,7 +60,10 @@ public class DefaultDatatypeChannelMessageConverter implements MessageConverter, @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (!this.conversionServiceSet && beanFactory != null) { - this.conversionService = IntegrationUtils.getConversionService(beanFactory); + ConversionService integrationConversionService = IntegrationUtils.getConversionService(beanFactory); + if (integrationConversionService != null) { + this.conversionService = integrationConversionService; + } } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/channel/config/channelParserTests.xml b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-context.xml similarity index 81% rename from spring-integration-core/src/test/java/org/springframework/integration/channel/config/channelParserTests.xml rename to spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-context.xml index 0f68088a85..3071b34203 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/channel/config/channelParserTests.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-context.xml @@ -35,7 +35,8 @@ - + @@ -46,7 +47,10 @@ - + + + + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-no-converter-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-no-converter-context.xml new file mode 100644 index 0000000000..1f2dee5540 --- /dev/null +++ b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests-no-converter-context.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests.java index bb734e8476..2211d24d90 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/channel/config/ChannelParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * 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. @@ -29,13 +29,17 @@ import static org.junit.Assert.assertTrue; import java.util.concurrent.Executor; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.FatalBeanException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.convert.converter.Converter; import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.channel.ExecutorChannel; import org.springframework.integration.channel.PublishSubscribeChannel; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.TestChannelInterceptor; @@ -53,6 +57,9 @@ import org.springframework.messaging.PollableChannel; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.support.ChannelInterceptorAdapter; import org.springframework.messaging.support.GenericMessage; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Mark Fisher @@ -62,8 +69,16 @@ import org.springframework.messaging.support.GenericMessage; * * @see ChannelWithCustomQueueParserTests */ +@ContextConfiguration(locations = { + "/org/springframework/integration/channel/config/ChannelParserTests-context.xml", + "/org/springframework/integration/channel/config/priorityChannelParserTests.xml" }) +@RunWith(SpringJUnit4ClassRunner.class) +@DirtiesContext public class ChannelParserTests { + @Autowired + private ApplicationContext context; + @Test(expected = FatalBeanException.class) public void testChannelWithoutId() { new ClassPathXmlApplicationContext("channelWithoutId.xml", this.getClass()).close(); @@ -71,56 +86,62 @@ public class ChannelParserTests { @Test public void testChannelWithCapacity() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("capacityChannel"); for (int i = 0; i < 10; i++) { boolean result = channel.send(new GenericMessage("test"), 10); assertTrue(result); } assertFalse(channel.send(new GenericMessage("test"), 3)); - context.close(); } @Test public void testDirectChannelByDefault() throws InterruptedException { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("defaultChannel"); - assertEquals(DirectChannel.class, channel.getClass()); + assertThat(channel, instanceOf(DirectChannel.class)); DirectFieldAccessor accessor = new DirectFieldAccessor(channel); Object dispatcher = accessor.getPropertyValue("dispatcher"); assertThat(dispatcher, is(instanceOf(UnicastingDispatcher.class))); assertThat(new DirectFieldAccessor(dispatcher).getPropertyValue("loadBalancingStrategy"), is(instanceOf(RoundRobinLoadBalancingStrategy.class))); + } + + @Test + public void testExecutorChannel() throws InterruptedException { + MessageChannel channel = context.getBean("executorChannel", MessageChannel.class); + assertThat(channel, instanceOf(ExecutorChannel.class)); + assertNotNull(TestUtils.getPropertyValue(channel, "messageConverter")); + assertNotNull(TestUtils.getPropertyValue(channel, "messageConverter.conversionService")); + } + + @Test + public void testExecutorChannelNoConverter() throws InterruptedException { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "ChannelParserTests-no-converter-context.xml", this.getClass()); + MessageChannel channel = context.getBean("executorChannel", MessageChannel.class); + assertThat(channel, instanceOf(ExecutorChannel.class)); + assertNotNull(TestUtils.getPropertyValue(channel, "messageConverter")); + assertNotNull(TestUtils.getPropertyValue(channel, "messageConverter.conversionService")); context.close(); } @Test public void channelWithFailoverDispatcherAttribute() throws Exception { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("channelWithFailover"); assertEquals(DirectChannel.class, channel.getClass()); DirectFieldAccessor accessor = new DirectFieldAccessor(channel); Object dispatcher = accessor.getPropertyValue("dispatcher"); assertThat(dispatcher, is(instanceOf(UnicastingDispatcher.class))); assertNull(new DirectFieldAccessor(dispatcher).getPropertyValue("loadBalancingStrategy")); - context.close(); } @Test public void testPublishSubscribeChannel() throws InterruptedException { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("publishSubscribeChannel"); assertEquals(PublishSubscribeChannel.class, channel.getClass()); } @Test public void testPublishSubscribeChannelWithTaskExecutorReference() throws InterruptedException { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("publishSubscribeChannelWithTaskExecutorRef"); assertEquals(PublishSubscribeChannel.class, channel.getClass()); DirectFieldAccessor accessor = new DirectFieldAccessor(channel); @@ -132,44 +153,34 @@ public class ChannelParserTests { Executor innerExecutor = (Executor) executorAccessor.getPropertyValue("executor"); Object executorBean = context.getBean("taskExecutor"); assertEquals(executorBean, innerExecutor); - context.close(); } @Test public void channelWithCustomQueue() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( - "channelParserTests.xml", this.getClass()); Object customQueue = context.getBean("customQueue"); Object channelWithCustomQueue = context.getBean("channelWithCustomQueue"); assertEquals(QueueChannel.class, channelWithCustomQueue.getClass()); Object actualQueue = new DirectFieldAccessor(channelWithCustomQueue).getPropertyValue("queue"); assertSame(customQueue, actualQueue); - context.close(); } @Test public void testDatatypeChannelWithCorrectType() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("integerChannel"); assertTrue(channel.send(new GenericMessage(123))); - context.close(); } @Test(expected = MessageDeliveryException.class) public void testDatatypeChannelWithIncorrectType() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("integerChannel"); channel.send(new GenericMessage("incorrect type")); - context.close(); assertTrue(TestUtils.getPropertyValue(channel, "messageConverter") instanceof UselessMessageConverter); } @Test public void testDatatypeChannelGlobalConverter() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserGlobalConverterTests.xml", this - .getClass()); + ClassPathXmlApplicationContext context = + new ClassPathXmlApplicationContext("channelParserGlobalConverterTests.xml", getClass()); MessageChannel channel = context.getBean("integerChannel", MessageChannel.class); context.close(); assertTrue(TestUtils.getPropertyValue(channel, "messageConverter") instanceof UselessMessageConverter); @@ -177,44 +188,36 @@ public class ChannelParserTests { @Test public void testDatatypeChannelWithAssignableSubTypes() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("numberChannel"); - assertTrue(channel.send(new GenericMessage(123))); - assertTrue(channel.send(new GenericMessage(123.45))); - assertTrue(channel.send(new GenericMessage(Boolean.TRUE))); - assertTrue(TestUtils.getPropertyValue(channel, "messageConverter") instanceof DefaultDatatypeChannelMessageConverter); + assertTrue(channel.send(new GenericMessage<>(123))); + assertTrue(channel.send(new GenericMessage<>(123.45))); + assertTrue(channel.send(new GenericMessage<>(Boolean.TRUE))); + assertThat(TestUtils.getPropertyValue(channel, "messageConverter"), + instanceOf(DefaultDatatypeChannelMessageConverter.class)); assertNotNull(TestUtils.getPropertyValue(channel, "messageConverter.conversionService")); - context.close(); } @Test public void testMultipleDatatypeChannelWithCorrectTypes() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("stringOrNumberChannel"); - assertTrue(channel.send(new GenericMessage(123))); - assertTrue(channel.send(new GenericMessage("accepted type"))); - context.close(); + assertTrue(channel.send(new GenericMessage<>(123))); + assertTrue(channel.send(new GenericMessage<>("accepted type"))); } @Test(expected = MessageDeliveryException.class) public void testMultipleDatatypeChannelWithIncorrectType() { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("channelParserTests.xml", this - .getClass()); MessageChannel channel = (MessageChannel) context.getBean("stringOrNumberChannel"); - channel.send(new GenericMessage(Boolean.TRUE)); - context.close(); + channel.send(new GenericMessage<>(Boolean.TRUE)); } @Test public void testChannelInteceptorRef() { - ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("channelInterceptorParserTests.xml", this - .getClass()); + ConfigurableApplicationContext context = + new ClassPathXmlApplicationContext("channelInterceptorParserTests.xml", getClass()); PollableChannel channel = (PollableChannel) context.getBean("channelWithInterceptorRef"); TestChannelInterceptor interceptor = (TestChannelInterceptor) context.getBean("interceptor"); assertEquals(0, interceptor.getSendCount()); - channel.send(new GenericMessage("test")); + channel.send(new GenericMessage<>("test")); assertEquals(1, interceptor.getSendCount()); assertEquals(0, interceptor.getReceiveCount()); channel.receive(); @@ -224,8 +227,8 @@ public class ChannelParserTests { @Test public void testChannelInteceptorInnerBean() { - ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("channelInterceptorParserTests.xml", this - .getClass()); + ConfigurableApplicationContext context = + new ClassPathXmlApplicationContext("channelInterceptorParserTests.xml", getClass()); PollableChannel channel = (PollableChannel) context.getBean("channelWithInterceptorInnerBean"); channel.send(new GenericMessage("test")); Message transformed = channel.receive(1000); @@ -235,8 +238,7 @@ public class ChannelParserTests { @Test public void testPriorityChannelWithDefaultComparator() { - ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("priorityChannelParserTests.xml", this.getClass()); - PollableChannel channel = (PollableChannel) context.getBean("priorityChannelWithDefaultComparator"); + PollableChannel channel = this.context.getBean("priorityChannelWithDefaultComparator", PollableChannel.class); Message lowPriorityMessage = MessageBuilder.withPayload("low").setPriority(-14).build(); Message midPriorityMessage = MessageBuilder.withPayload("mid").setPriority(0).build(); Message highPriorityMessage = MessageBuilder.withPayload("high").setPriority(99).build(); @@ -249,18 +251,15 @@ public class ChannelParserTests { assertEquals("high", reply1.getPayload()); assertEquals("mid", reply2.getPayload()); assertEquals("low", reply3.getPayload()); - context.close(); } @Test public void testPriorityChannelWithCustomComparator() { - ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("priorityChannelParserTests.xml", this - .getClass()); - PollableChannel channel = (PollableChannel) context.getBean("priorityChannelWithCustomComparator"); - channel.send(new GenericMessage("C")); - channel.send(new GenericMessage("A")); - channel.send(new GenericMessage("D")); - channel.send(new GenericMessage("B")); + PollableChannel channel = this.context.getBean("priorityChannelWithCustomComparator", PollableChannel.class); + channel.send(new GenericMessage<>("C")); + channel.send(new GenericMessage<>("A")); + channel.send(new GenericMessage<>("D")); + channel.send(new GenericMessage<>("B")); Message reply1 = channel.receive(0); Message reply2 = channel.receive(0); Message reply3 = channel.receive(0); @@ -269,30 +268,26 @@ public class ChannelParserTests { assertEquals("B", reply2.getPayload()); assertEquals("C", reply3.getPayload()); assertEquals("D", reply4.getPayload()); - context.close(); } @Test public void testPriorityChannelWithIntegerDatatypeEnforced() { - ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("priorityChannelParserTests.xml", this - .getClass()); - PollableChannel channel = (PollableChannel) context.getBean("integerOnlyPriorityChannel"); - channel.send(new GenericMessage(3)); - channel.send(new GenericMessage(2)); - channel.send(new GenericMessage(1)); + PollableChannel channel = this.context.getBean("integerOnlyPriorityChannel", PollableChannel.class); + channel.send(new GenericMessage<>(3)); + channel.send(new GenericMessage<>(2)); + channel.send(new GenericMessage<>(1)); assertEquals(1, channel.receive(0).getPayload()); assertEquals(2, channel.receive(0).getPayload()); assertEquals(3, channel.receive(0).getPayload()); boolean threwException = false; try { - channel.send(new GenericMessage("wrong type")); + channel.send(new GenericMessage<>("wrong type")); } catch (MessageDeliveryException e) { assertEquals("wrong type", e.getFailedMessage().getPayload()); threwException = true; } assertTrue(threwException); - context.close(); } public static class TestInterceptor extends ChannelInterceptorAdapter {