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 &gt; 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\">&lt;foo&gt;Camel &amp;gt; 
Donkey&lt;/foo&gt;</body>\n</message>", out);
+        assertEquals("<message exchangeId=\"" + 
exchanges.get(0).getExchangeId() + "\">\n<body 
type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; 
Donkey&lt;/foo&gt;</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 &gt; 
Donkey</body>\n</message>", out);
+        assertEquals("<message exchangeId=\"" + 
exchanges.get(1).getExchangeId() + "\">\n<body type=\"java.lang.String\">Camel 
&gt; 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 &amp; You</header>\n</headers>\n"
+        assertEquals("<message exchangeId=\"" + 
exchanges.get(2).getExchangeId() + "\">\n<headers>\n<header key=\"name\" 
type=\"java.lang.String\">Me &amp; You</header>\n</headers>\n"
                 + "<body type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; 
Donkey&lt;/foo&gt;</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\">&lt;title&gt;Me &amp;amp; 
You&lt;/title&gt;</header>\n</headers>\n"
+        assertEquals("<message exchangeId=\"" + 
exchanges.get(3).getExchangeId() + "\">\n<headers>\n"
+                + "<header key=\"title\" 
type=\"java.lang.String\">&lt;title&gt;Me &amp;amp; 
You&lt;/title&gt;</header>\n</headers>\n"
                 + "<body type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; 
Donkey&lt;/foo&gt;</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 &amp; You</header>\n</headers>\n"
+        assertEquals("<message exchangeId=\"" + 
exchanges.get(4).getExchangeId() + "\">\n<headers>\n<header key=\"name\" 
type=\"java.lang.String\">Me &amp; You</header>\n</headers>\n"
                 + "<body type=\"java.lang.String\">Camel &gt; 
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\">&lt;animal&gt;&lt;name&gt;Donkey&lt;/name&gt;&lt;age&gt;17&lt;/age&gt;&lt;/animal&gt;</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\">&lt;?xml version=&quot;1.0&quot;?&gt;&lt;hi&gt;Hello 
World&lt;/hi&gt;</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();
     }


Reply via email to