/* * Copyright 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.support.management.graph; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import java.io.ByteArrayOutputStream; import java.util.Arrays; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.integration.annotation.Filter; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.annotation.Router; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.channel.MessagePublishingErrorHandler; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.config.EnableIntegrationManagement; import org.springframework.integration.core.MessageProducer; import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.endpoint.MessageProducerSupport; import org.springframework.integration.endpoint.PollingConsumer; import org.springframework.integration.router.ExpressionEvaluatingRouter; import org.springframework.integration.router.HeaderValueRouter; import org.springframework.integration.router.RecipientListRouter; import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.SubscribableChannel; import org.springframework.scheduling.support.PeriodicTrigger; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; /** * @author Gary Russell * @author Artem Bilan * @since 4.3 * */ @RunWith(SpringJUnit4ClassRunner.class) @DirtiesContext public class IntegrationGraphServerTests { @Autowired private IntegrationGraphServer server; @Autowired private MessageChannel toRouter; @SuppressWarnings("unchecked") @Test public void test() throws Exception { Graph graph = this.server.getGraph(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); objectMapper.writeValue(baos, graph); // System . out . println(new String(baos.toByteArray())); Map<?, ?> map = objectMapper.readValue(baos.toByteArray(), Map.class); assertThat(map.size(), is(equalTo(3))); List<Map<?, ?>> nodes = (List<Map<?, ?>>) map.get("nodes"); assertThat(nodes, is(notNullValue())); assertThat(nodes.size(), is(equalTo(32))); List<Map<?, ?>> links = (List<Map<?, ?>>) map.get("links"); assertThat(links, is(notNullValue())); assertThat(links.size(), is(equalTo(33))); toRouter.send(MessageBuilder.withPayload("foo").setHeader("foo", "bar").build()); toRouter.send(MessageBuilder.withPayload("foo").setHeader("foo", "baz").build()); toRouter.send(MessageBuilder.withPayload("foo").setHeader("foo", "quxChannel").build()); toRouter.send(MessageBuilder.withPayload("foo").setHeader("foo", "fizChannel").build()); this.server.rebuild(); graph = this.server.getGraph(); baos = new ByteArrayOutputStream(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); objectMapper.writeValue(baos, graph); // System . out . println(new String(baos.toByteArray())); map = objectMapper.readValue(baos.toByteArray(), Map.class); assertThat(map.size(), is(equalTo(3))); nodes = (List<Map<?, ?>>) map.get("nodes"); assertThat(nodes, is(notNullValue())); assertThat(nodes.size(), is(equalTo(32))); links = (List<Map<?, ?>>) map.get("links"); assertThat(links, is(notNullValue())); assertThat(links.size(), is(equalTo(35))); } @Configuration @EnableIntegration @EnableIntegrationManagement @IntegrationComponentScan @ImportResource("org/springframework/integration/support/management/graph/integration-graph-context.xml") public static class Config { @Bean public IntegrationGraphServer server() { IntegrationGraphServer server = new IntegrationGraphServer(); server.setApplicationName("myAppName:1.0"); return server; } @Bean public MessageProducer producer() { MessageProducerSupport producer = new MessageProducerSupport() { @Override public String getComponentType() { return "test-producer"; } }; producer.setOutputChannelName("one"); producer.setErrorChannelName("myErrors"); return producer; } @Bean public Services services() { return new Services(); } @Bean public EventDrivenConsumer foreignMessageHandlerNoStats() { return new EventDrivenConsumer(three(), new BareHandler()); } @Bean public PollingConsumer polling() { PollingConsumer pollingConsumer = new PollingConsumer(four(), new BareHandler()); pollingConsumer.setAutoStartup(false); return pollingConsumer; } @Bean public PollableChannel polledChannel() { return new QueueChannel(); } @Bean public SubscribableChannel three() { return new DirectChannel(); } @Bean public PollableChannel four() { return new QueueChannel(); } @Bean public PollableChannel myErrors() { return new QueueChannel(); } @Bean(name = PollerMetadata.DEFAULT_POLLER) public PollerMetadata defaultPoller() { PollerMetadata poller = new PollerMetadata(); poller.setTrigger(new PeriodicTrigger(60000)); MessagePublishingErrorHandler errorHandler = new MessagePublishingErrorHandler(); errorHandler.setDefaultErrorChannel(myErrors()); poller.setErrorHandler(errorHandler); return poller; } @Bean @Router(inputChannel = "toRouter") public HeaderValueRouter router() { HeaderValueRouter router = new HeaderValueRouter("foo"); router.setChannelMapping("bar", "barChannel"); router.setChannelMapping("baz", "bazChannel"); router.setDefaultOutputChannel(discards()); return router; } @Bean @Router(inputChannel = "four") public RecipientListRouter rlRouter() { RecipientListRouter router = new RecipientListRouter(); router.setChannels(Arrays.asList(barChannel(), bazChannel())); router.setDefaultOutputChannel(discards()); return router; } @Bean @Router(inputChannel = "four") public ExpressionEvaluatingRouter expressionRouter() { ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter( new SpelExpressionParser().parseExpression("headers['foo']")); router.setDefaultOutputChannel(discards()); return router; } @Bean public MessageChannel discards() { return new DirectChannel(); } @Bean public MessageChannel toRouter() { return new DirectChannel(); } @Bean public MessageChannel barChannel() { return new QueueChannel(); } @Bean public MessageChannel bazChannel() { return new QueueChannel(); } @Bean public MessageChannel quxChannel() { return new QueueChannel(); } @Bean public MessageChannel fizChannel() { return new QueueChannel(); } } public static class Services { @ServiceActivator(inputChannel = "one", outputChannel = "polledChannel") public String foo(String foo) { return foo.toUpperCase(); } @ServiceActivator(inputChannel = "polledChannel") public void bar(String foo) { } @Filter(inputChannel = "filterChannel") public boolean filter(String payload) { return false; } } public static class BareHandler implements MessageHandler { @Override public void handleMessage(Message<?> message) throws MessagingException { // empty } } @MessagingGateway(defaultRequestChannel = "four") public interface Gate { void foo(String foo); void foo(Integer foo); void bar(String bar); } }