From d22c831c51175308611059cb7d175cc3e6d52fb9 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sun, 12 Dec 2010 12:13:57 +0000 Subject: [PATCH] INT-1628: expose WireTap via @ManagedResource --- .../channel/interceptor/WireTap.java | 8 ++++- .../integration/config/xml/WireTapParser.java | 36 ++++++++++--------- .../config/xml/spring-integration-2.0.xsd | 1 + .../config/WireTapParserTests.java | 10 +++++- .../integration/config/wireTapParserTests.xml | 7 ++++ 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/channel/interceptor/WireTap.java b/spring-integration-core/src/main/java/org/springframework/integration/channel/interceptor/WireTap.java index 4857288866..b7a23c7d05 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/channel/interceptor/WireTap.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/channel/interceptor/WireTap.java @@ -18,12 +18,14 @@ package org.springframework.integration.channel.interceptor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.context.Lifecycle; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; import org.springframework.integration.channel.ChannelInterceptor; import org.springframework.integration.core.MessageSelector; +import org.springframework.jmx.export.annotation.ManagedAttribute; +import org.springframework.jmx.export.annotation.ManagedOperation; +import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.util.Assert; /** @@ -32,6 +34,7 @@ import org.springframework.util.Assert; * * @author Mark Fisher */ +@ManagedResource public class WireTap extends ChannelInterceptorAdapter implements Lifecycle { private static final Log logger = LogFactory.getLog(WireTap.class); @@ -80,6 +83,7 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle { /** * Check whether the wire tap is currently running. */ + @ManagedAttribute public boolean isRunning() { return this.running; } @@ -87,6 +91,7 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle { /** * Restart the wire tap if it has been stopped. It is running by default. */ + @ManagedOperation public void start() { this.running = true; } @@ -94,6 +99,7 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle { /** * Stop the wire tap. To restart, invoke {@link #start()}. */ + @ManagedOperation public void stop() { this.running = false; } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/WireTapParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/WireTapParser.java index 8f121705e5..13d427db24 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/WireTapParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/WireTapParser.java @@ -1,23 +1,21 @@ /* * 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. + * + * 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 org.w3c.dom.Element; +import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.ParserContext; @@ -31,8 +29,8 @@ import org.springframework.util.StringUtils; public class WireTapParser implements BeanDefinitionRegisteringParser { public String parse(Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( - IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.interceptor.WireTap"); + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .genericBeanDefinition(IntegrationNamespaceUtils.BASE_PACKAGE + ".channel.interceptor.WireTap"); String targetRef = element.getAttribute("channel"); if (!StringUtils.hasText(targetRef)) { parserContext.getReaderContext().error("The 'channel' attribute is required.", element); @@ -46,8 +44,14 @@ public class WireTapParser implements BeanDefinitionRegisteringParser { if (StringUtils.hasText(timeout)) { builder.addPropertyValue("timeout", Long.parseLong(timeout)); } - return BeanDefinitionReaderUtils.registerWithGeneratedName( - builder.getBeanDefinition(), parserContext.getRegistry()); + String id = element.getAttribute("id"); + if (StringUtils.hasText(id)) { + BeanDefinitionReaderUtils.registerBeanDefinition(new BeanDefinitionHolder(builder.getBeanDefinition(), id), + parserContext.getRegistry()); + return id; + } + return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), + parserContext.getRegistry()); } } diff --git a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd index 4bfa987685..220df9f9a9 100644 --- a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd +++ b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd @@ -2488,6 +2488,7 @@ Name of the header whose value will be used to route messages Defines a Wire Tap Channel Interceptor. + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/WireTapParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/WireTapParserTests.java index f10bb11092..649713409f 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/config/WireTapParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/WireTapParserTests.java @@ -51,6 +51,14 @@ public class WireTapParserTests { assertEquals(original, intercepted); } + @Test + public void simpleWireTapWithId() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "wireTapParserTests.xml", this.getClass()); + WireTap wireTap = (WireTap) context.getBean("wireTap"); + assertNotNull(wireTap); + } + @Test public void wireTapWithAcceptingSelector() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( @@ -98,7 +106,7 @@ public class WireTapParserTests { otherTimeoutCount++; } } - assertEquals(3, defaultTimeoutCount); + assertEquals(4, defaultTimeoutCount); assertEquals(1, expectedTimeoutCount); assertEquals(0, otherTimeoutCount); } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/wireTapParserTests.xml b/spring-integration-core/src/test/java/org/springframework/integration/config/wireTapParserTests.xml index 4534a21fc8..be4d51d520 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/config/wireTapParserTests.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/wireTapParserTests.xml @@ -18,6 +18,13 @@ + + + + + + +