Author: dkulp Date: Mon Sep 19 17:29:02 2011 New Revision: 1172722 URL: http://svn.apache.org/viewvc?rev=1172722&view=rev Log: Merged revisions 1158230,1158295 via svnmerge from https://svn.apache.org/repos/asf/camel/trunk
........ r1158230 | davsclaus | 2011-08-16 08:25:31 -0400 (Tue, 16 Aug 2011) | 1 line CAMEL-4338: Improved browsable endpoint for JMX, to browse range/all messages as xml. As well to include/not include message body. ........ r1158295 | davsclaus | 2011-08-16 10:37:32 -0400 (Tue, 16 Aug 2011) | 1 line CAMEL-4338: Include exchangeId in xml messages so in JMX browsable endpoint. Be backwards compatible, marked old method as @deprecated. ........ Modified: camel/branches/camel-2.8.x/ (props changed) camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBrowsableEndpoint.java camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/management/ManagedBrowseableEndpointAsXmlTest.java camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java camel/branches/camel-2.8.x/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsQueueEndpoint.java Propchange: camel/branches/camel-2.8.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 19 17:29:02 2011 @@ -1 +1 @@ -/camel/trunk:1148706,1148710,1149570,1150651,1151000,1151054,1151087,1151126,1151362,1152170,1152569,1152733,1152755,1152868,1153620,1153812,1153829,1154684,1155230,1156108,1156260,1156277,1156479,1156524,1157348,1157749,1157798,1157831,1157878,1158153,1159171,1159174,1159326,1159457,1159460,1159606,1159682-1159683,1159867,1160547,1160637,1161010,1161082,1161524,1162309,1162395,1163231,1163420,1163656-1163669,1163725,1164544,1164557,1164633,1164972-1165000,1165152,1165157,1165658,1165971,1165987,1167098,1167131,1167448,1167487,1167555,1169610,1169620,1170122,1170226,1170397,1170956,1171396,1171755,1171941,1171947 +/camel/trunk:1148706,1148710,1149570,1150651,1151000,1151054,1151087,1151126,1151362,1152170,1152569,1152733,1152755,1152868,1153620,1153812,1153829,1154684,1155230,1156108,1156260,1156277,1156479,1156524,1157348,1157749,1157798,1157831,1157878,1158153,1158230,1158295,1159171,1159174,1159326,1159457,1159460,1159606,1159682-1159683,1159867,1160547,1160637,1161010,1161082,1161524,1162309,1162395,1163231,1163420,1163656-1163669,1163725,1164544,1164557,1164633,1164972-1165000,1165152,1165157,1165658,1165971,1165987,1167098,1167131,1167448,1167487,1167555,1169610,1169620,1170122,1170226,1170397,1170956,1171396,1171755,1171941,1171947 Propchange: camel/branches/camel-2.8.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBrowsableEndpoint.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBrowsableEndpoint.java?rev=1172722&r1=1172721&r2=1172722&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBrowsableEndpoint.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBrowsableEndpoint.java Mon Sep 19 17:29:02 2011 @@ -16,6 +16,8 @@ */ package org.apache.camel.management.mbean; +import java.util.List; + import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.spi.BrowsableEndpoint; @@ -47,10 +49,12 @@ public class ManagedBrowsableEndpoint ex @ManagedOperation(description = "Get Exchange from queue by index") public String browseExchange(Integer index) { - if (index >= endpoint.getExchanges().size()) { + List<Exchange> exchanges = endpoint.getExchanges(); + + if (index >= exchanges.size()) { return null; } - Exchange exchange = endpoint.getExchanges().get(index); + Exchange exchange = exchanges.get(index); if (exchange == null) { return null; } @@ -60,39 +64,86 @@ public class ManagedBrowsableEndpoint ex @ManagedOperation(description = "Get message body from queue by index") public String browseMessageBody(Integer index) { - if (index >= endpoint.getExchanges().size()) { + List<Exchange> exchanges = endpoint.getExchanges(); + + if (index >= exchanges.size()) { return null; } - Exchange exchange = endpoint.getExchanges().get(index); + Exchange exchange = exchanges.get(index); if (exchange == null) { return null; } - Object body; + // must use java type with JMX such as java.lang.String + String body; if (exchange.hasOut()) { - body = exchange.getOut().getBody(); + body = exchange.getOut().getBody(String.class); } else { - body = exchange.getIn().getBody(); + body = exchange.getIn().getBody(String.class); } - // must use java type with JMX such as java.lang.String - return body != null ? body.toString() : null; + return body; } + /** + * @deprecated use {@link #browseAllMessagesAsXml(Boolean)} instead + */ @ManagedOperation(description = "Get message as XML from queue by index") + @Deprecated public String browseMessageAsXml(Integer index) { - if (index >= endpoint.getExchanges().size()) { + return browseMessageAsXml(index, true); + } + + @ManagedOperation(description = "Get message as XML from queue by index") + public String browseMessageAsXml(Integer index, Boolean includeBody) { + List<Exchange> exchanges = endpoint.getExchanges(); + + if (index >= exchanges.size()) { return null; } - Exchange exchange = endpoint.getExchanges().get(index); + Exchange exchange = exchanges.get(index); if (exchange == null) { return null; } Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn(); - String xml = MessageHelper.dumpAsXml(msg); + String xml = MessageHelper.dumpAsXml(msg, includeBody); return xml; } + @ManagedOperation(description = "Gets all the messages as XML from the queue") + public String browseAllMessagesAsXml(Boolean includeBody) { + return browseRangeMessagesAsXml(0, Integer.MAX_VALUE, includeBody); + } + + @ManagedOperation(description = "Gets the range of messages as XML from the queue") + public String browseRangeMessagesAsXml(Integer fromIndex, Integer toIndex, Boolean includeBody) { + if (fromIndex == null) { + fromIndex = 0; + } + if (toIndex == null) { + toIndex = Integer.MAX_VALUE; + } + if (fromIndex > toIndex) { + throw new IllegalArgumentException("From index cannot be larger than to index, was: " + fromIndex + " > " + toIndex); + } + + List<Exchange> exchanges = endpoint.getExchanges(); + if (exchanges.size() == 0) { + return null; + } + + StringBuilder sb = new StringBuilder(); + sb.append("<messages>"); + for (int i = fromIndex; i < exchanges.size() && i <= toIndex; i++) { + Exchange exchange = exchanges.get(i); + Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn(); + String xml = MessageHelper.dumpAsXml(msg, includeBody); + sb.append("\n").append(xml); + } + sb.append("\n</messages>"); + return sb.toString(); + } + } Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java?rev=1172722&r1=1172721&r2=1172722&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java Mon Sep 19 17:29:02 2011 @@ -253,8 +253,20 @@ public final class MessageHelper { * @return the XML */ public static String dumpAsXml(Message message) { + return dumpAsXml(message, true); + } + + /** + * Dumps the message as a generic XML structure. + * + * @param message the message + * @param includeBody whether or not to include the message body + * @return the XML + */ + public static String dumpAsXml(Message message, boolean includeBody) { StringBuilder sb = new StringBuilder(); - sb.append("<message>\n"); + // include exchangeId as attribute on the <message> tag + sb.append("<message exchangeId=\"").append(message.getExchange().getExchangeId()).append("\">\n"); // headers if (message.hasHeaders()) { @@ -288,24 +300,24 @@ public final class MessageHelper { sb.append("</headers>\n"); } - sb.append("<body"); - String type = ObjectHelper.classCanonicalName(message.getBody()); - if (type != null) { - sb.append(" type=\"" + type + "\""); - } - sb.append(">"); + if (includeBody) { + sb.append("<body"); + String type = ObjectHelper.classCanonicalName(message.getBody()); + if (type != null) { + sb.append(" type=\"" + type + "\""); + } + sb.append(">"); - // dump body value as XML, use Camel type converter to convert to String - try { - String xml = message.getBody(String.class); + // dump body value as XML, use Camel type converter to convert to String + // do not allow streams and clip very big message bodies (128kb) + String xml = extractBodyForLogging(message, "", false, 128 * 1024); if (xml != null) { + // must always xml encode sb.append(StringHelper.xmlEncode(xml)); } - } catch (Exception e) { - // ignore as the body is for logging purpose - } - sb.append("</body>\n"); + sb.append("</body>\n"); + } sb.append("</message>"); return sb.toString(); Modified: camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/management/ManagedBrowseableEndpointAsXmlTest.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/management/ManagedBrowseableEndpointAsXmlTest.java?rev=1172722&r1=1172721&r2=1172722&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/management/ManagedBrowseableEndpointAsXmlTest.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/management/ManagedBrowseableEndpointAsXmlTest.java Mon Sep 19 17:29:02 2011 @@ -17,10 +17,12 @@ package org.apache.camel.management; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.management.MBeanServer; import javax.management.ObjectName; +import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; /** @@ -28,7 +30,7 @@ import org.apache.camel.builder.RouteBui */ public class ManagedBrowseableEndpointAsXmlTest extends ManagementTestSupport { - public void testBrowseableEndpointAsXml() throws Exception { + public void testBrowseableEndpointAsXmlIncludeBody() throws Exception { getMockEndpoint("mock:result").expectedMessageCount(7); template.sendBody("direct:start", "<foo>Camel > Donkey</foo>"); @@ -45,53 +47,191 @@ public class ManagedBrowseableEndpointAs assertMockEndpointsSatisfied(); + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + MBeanServer mbeanServer = getMBeanServer(); ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); - String out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{0}, new String[]{"java.lang.Integer"}); + String out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{0, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<body type=\"java.lang.String\"><foo>Camel &gt; Donkey</foo></body>\n</message>", out); + assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<body type=\"java.lang.String\"><foo>Camel &gt; Donkey</foo></body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{1}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{1, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<body type=\"java.lang.String\">Camel > Donkey</body>\n</message>", out); + assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<body type=\"java.lang.String\">Camel > Donkey</body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{2}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{2, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<headers>\n<header key=\"name\" type=\"java.lang.String\">Me & You</header>\n</headers>\n" + assertEquals("<message exchangeId=\"" + exchanges.get(2).getExchangeId() + "\">\n<headers>\n<header key=\"name\" type=\"java.lang.String\">Me & You</header>\n</headers>\n" + "<body type=\"java.lang.String\"><foo>Camel &gt; Donkey</foo></body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{3}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{3, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<headers>\n<header key=\"title\" type=\"java.lang.String\"><title>Me &amp; You</title></header>\n</headers>\n" + assertEquals("<message exchangeId=\"" + exchanges.get(3).getExchangeId() + "\">\n<headers>\n" + + "<header key=\"title\" type=\"java.lang.String\"><title>Me &amp; You</title></header>\n</headers>\n" + "<body type=\"java.lang.String\"><foo>Camel &gt; Donkey</foo></body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{4}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{4, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<headers>\n<header key=\"name\" type=\"java.lang.String\">Me & You</header>\n</headers>\n" + assertEquals("<message exchangeId=\"" + exchanges.get(4).getExchangeId() + "\">\n<headers>\n<header key=\"name\" type=\"java.lang.String\">Me & You</header>\n</headers>\n" + "<body type=\"java.lang.String\">Camel > Donkey</body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{5}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{5, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<headers>\n<header key=\"user\" type=\"java.lang.Boolean\">true</header>\n</headers>\n" + assertEquals("<message exchangeId=\"" + exchanges.get(5).getExchangeId() + "\">\n<headers>\n<header key=\"user\" type=\"java.lang.Boolean\">true</header>\n</headers>\n" + "<body type=\"java.lang.Integer\">123</body>\n</message>", out); - out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{6}, new String[]{"java.lang.Integer"}); + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{6, true}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); assertNotNull(out); log.info(out); - assertEquals("<message>\n<headers>\n<header key=\"title\" type=\"java.lang.String\">Camel rocks</header>\n" + assertEquals("<message exchangeId=\"" + exchanges.get(6).getExchangeId() + "\">\n<headers>\n<header key=\"title\" type=\"java.lang.String\">Camel rocks</header>\n" + "<header key=\"uid\" type=\"java.lang.Integer\">123</header>\n" + "<header key=\"user\" type=\"java.lang.Boolean\">false</header>\n</headers>\n" + "<body type=\"java.lang.String\"><animal><name>Donkey</name><age>17</age></animal></body>\n</message>", out); } + public void testBrowseableEndpointAsXml() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + + template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123); + template.sendBodyAndHeader("direct:start", "Bye World", "foo", 456); + + assertMockEndpointsSatisfied(); + + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + String out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{0, false}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + + assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">123</header>\n</headers>\n</message>", out); + + out = (String) mbeanServer.invoke(name, "browseMessageAsXml", new Object[]{1, false}, new String[]{"java.lang.Integer", "java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">456</header>\n</headers>\n</message>", out); + } + + public void testBrowseableEndpointAsXmlAllIncludeBody() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + + template.sendBody("direct:start", "Hello World"); + template.sendBodyAndHeader("direct:start", "Bye World", "foo", 456); + + assertMockEndpointsSatisfied(); + + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + String out = (String) mbeanServer.invoke(name, "browseAllMessagesAsXml", new Object[]{true}, new String[]{"java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + + assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<body type=\"java.lang.String\">Hello World</body>\n</message>\n" + + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">456</header>\n</headers>\n" + + "<body type=\"java.lang.String\">Bye World</body>\n</message>\n</messages>", out); + } + + public void testBrowseableEndpointAsXmlAll() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + + template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123); + template.sendBodyAndHeader("direct:start", "Bye World", "foo", 456); + + assertMockEndpointsSatisfied(); + + MBeanServer mbeanServer = getMBeanServer(); + + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + String out = (String) mbeanServer.invoke(name, "browseAllMessagesAsXml", new Object[]{false}, new String[]{"java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + + assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<headers>\n" + + "<header key=\"foo\" type=\"java.lang.Integer\">123</header>\n</headers>\n</message>\n" + + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">456</header>\n</headers>\n" + + "</message>\n</messages>", out); + } + + public void testBrowseableEndpointAsXmlRangeIncludeBody() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(3); + + template.sendBody("direct:start", "Hello World"); + template.sendBodyAndHeader("direct:start", "Bye World", "foo", 456); + template.sendBody("direct:start", "Hi Camel"); + + assertMockEndpointsSatisfied(); + + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + String out = (String) mbeanServer.invoke(name, "browseRangeMessagesAsXml", new Object[]{0, 1, true}, new String[]{"java.lang.Integer", "java.lang.Integer", "java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + + assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<body type=\"java.lang.String\">Hello World</body>\n</message>\n" + + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">456</header>\n</headers>\n" + + "<body type=\"java.lang.String\">Bye World</body>\n</message>\n</messages>", out); + } + + public void testBrowseableEndpointAsXmlRange() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(3); + + template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123); + template.sendBodyAndHeader("direct:start", "Bye World", "foo", 456); + template.sendBody("direct:start", "Hi Camel"); + + assertMockEndpointsSatisfied(); + + List<Exchange> exchanges = getMockEndpoint("mock:result").getReceivedExchanges(); + + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + String out = (String) mbeanServer.invoke(name, "browseRangeMessagesAsXml", new Object[]{0, 1, false}, new String[]{"java.lang.Integer", "java.lang.Integer", "java.lang.Boolean"}); + assertNotNull(out); + log.info(out); + + assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">123</header>\n</headers>\n</message>\n" + + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\">\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">456</header>\n</headers>\n" + + "</message>\n</messages>", out); + } + + public void testBrowseableEndpointAsXmlRangeInvalidIndex() throws Exception { + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName name = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"mock://result\""); + + try { + mbeanServer.invoke(name, "browseRangeMessagesAsXml", new Object[]{3, 1, false}, new String[]{"java.lang.Integer", "java.lang.Integer", "java.lang.Boolean"}); + fail("Should have thrown exception"); + } catch (Exception e) { + assertIsInstanceOf(IllegalArgumentException.class, e.getCause()); + assertEquals("From index cannot be larger than to index, was: 3 > 1", e.getCause().getMessage()); + } + } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { Modified: camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java?rev=1172722&r1=1172721&r2=1172722&view=diff ============================================================================== --- camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java (original) +++ camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java Mon Sep 19 17:29:02 2011 @@ -20,9 +20,12 @@ import java.io.IOException; import java.io.OutputStream; import junit.framework.TestCase; +import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.StreamCache; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.impl.DefaultExchange; import org.apache.camel.impl.DefaultMessage; /** @@ -99,4 +102,55 @@ public class MessageHelperTest extends T assertEquals(456, target.getHeader("bar")); } + public void testDumpAsXmlPlainBody() throws Exception { + CamelContext context = new DefaultCamelContext(); + context.start(); + + message = new DefaultExchange(context).getIn(); + + // xml message body + message.setBody("Hello World"); + message.setHeader("foo", 123); + + String out = MessageHelper.dumpAsXml(message); + assertTrue("Should contain body", out.contains("<body type=\"java.lang.String\">Hello World</body>")); + + context.stop(); + } + + public void testDumpAsXmlBody() throws Exception { + CamelContext context = new DefaultCamelContext(); + context.start(); + + message = new DefaultExchange(context).getIn(); + + // xml message body + message.setBody("<?xml version=\"1.0\"?><hi>Hello World</hi>"); + message.setHeader("foo", 123); + + String out = MessageHelper.dumpAsXml(message); + assertTrue("Should contain body", out.contains("<body type=\"java.lang.String\"><?xml version="1.0"?><hi>Hello World</hi></body>")); + assertTrue("Should contain exchangeId", out.contains(message.getExchange().getExchangeId())); + + context.stop(); + } + + public void testDumpAsXmlNoBody() throws Exception { + CamelContext context = new DefaultCamelContext(); + context.start(); + + message = new DefaultExchange(context).getIn(); + + // xml message body + message.setBody("Hello World"); + message.setHeader("foo", 123); + + String out = MessageHelper.dumpAsXml(message, false); + + assertEquals("<message exchangeId=\"" + message.getExchange().getExchangeId() + "\">" + + "\n<headers>\n<header key=\"foo\" type=\"java.lang.Integer\">123</header>\n</headers>\n</message>", out); + + context.stop(); + } + } Modified: camel/branches/camel-2.8.x/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsQueueEndpoint.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsQueueEndpoint.java?rev=1172722&r1=1172721&r2=1172722&view=diff ============================================================================== --- camel/branches/camel-2.8.x/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsQueueEndpoint.java (original) +++ camel/branches/camel-2.8.x/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsQueueEndpoint.java Mon Sep 19 17:29:02 2011 @@ -127,19 +127,19 @@ public class JmsQueueEndpoint extends Jm return null; } - Object body; + // must use java type with JMX such as java.lang.String + String body; if (exchange.hasOut()) { - body = exchange.getOut().getBody(); + body = exchange.getOut().getBody(String.class); } else { - body = exchange.getIn().getBody(); + body = exchange.getIn().getBody(String.class); } - // must use java type with JMX such as java.lang.String - return body != null ? body.toString() : null; + return body; } @ManagedOperation(description = "Get message as XML from queue by index") - public String browseMessageAsXml(Integer index) { + public String browseMessageAsXml(Integer index, Boolean includeBody) { List<Exchange> exchanges = getExchanges(); if (index >= exchanges.size()) { return null; @@ -150,11 +150,45 @@ public class JmsQueueEndpoint extends Jm } Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn(); - String xml = MessageHelper.dumpAsXml(msg); + String xml = MessageHelper.dumpAsXml(msg, includeBody); return xml; } + @ManagedOperation(description = "Gets all the messages as XML from the queue") + public String browseAllMessagesAsXml(Boolean includeBody) { + return browseRangeMessagesAsXml(0, Integer.MAX_VALUE, includeBody); + } + + @ManagedOperation(description = "Gets the range of messages as XML from the queue") + public String browseRangeMessagesAsXml(Integer fromIndex, Integer toIndex, Boolean includeBody) { + if (fromIndex == null) { + fromIndex = 0; + } + if (toIndex == null) { + toIndex = Integer.MAX_VALUE; + } + if (fromIndex > toIndex) { + throw new IllegalArgumentException("From index cannot be larger than to index, was: " + fromIndex + " > " + toIndex); + } + + List<Exchange> exchanges = getExchanges(); + if (exchanges.size() == 0) { + return null; + } + + StringBuilder sb = new StringBuilder(); + sb.append("<messages>"); + for (int i = fromIndex; i < exchanges.size() && i <= toIndex; i++) { + Exchange exchange = exchanges.get(i); + Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn(); + String xml = MessageHelper.dumpAsXml(msg, includeBody); + sb.append("\n").append(xml); + } + sb.append("\n</messages>"); + return sb.toString(); + } + protected QueueBrowseStrategy createQueueBrowseStrategy() { return new DefaultQueueBrowseStrategy(); }