001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.management.mbean;
018    
019    import java.util.List;
020    
021    import org.apache.camel.Exchange;
022    import org.apache.camel.Message;
023    import org.apache.camel.api.management.ManagedResource;
024    import org.apache.camel.api.management.mbean.ManagedBrowsableEndpointMBean;
025    import org.apache.camel.spi.BrowsableEndpoint;
026    import org.apache.camel.util.MessageHelper;
027    
028    /**
029     * @version
030     */
031    @ManagedResource(description = "Managed BrowsableEndpoint")
032    public class ManagedBrowsableEndpoint extends ManagedEndpoint implements ManagedBrowsableEndpointMBean {
033    
034        public ManagedBrowsableEndpoint(BrowsableEndpoint endpoint) {
035            super(endpoint);
036        }
037    
038        @Override
039        public BrowsableEndpoint getEndpoint() {
040            return (BrowsableEndpoint) super.getEndpoint();
041        }
042    
043        @Override
044        public BrowsableEndpoint getInstance() {
045            return getEndpoint();
046        }
047    
048        @Override
049        public long queueSize() {
050            return getEndpoint().getExchanges().size();
051        }
052    
053        @Override
054        public String browseExchange(Integer index) {
055            List<Exchange> exchanges = getEndpoint().getExchanges();
056    
057            if (index >= exchanges.size()) {
058                return null;
059            }
060            Exchange exchange = exchanges.get(index);
061            if (exchange == null) {
062                return null;
063            }
064            // must use java type with JMX such as java.lang.String
065            return exchange.toString();
066        }
067    
068        @Override
069        public String browseMessageBody(Integer index) {
070            List<Exchange> exchanges = getEndpoint().getExchanges();
071    
072            if (index >= exchanges.size()) {
073                return null;
074            }
075            Exchange exchange = exchanges.get(index);
076            if (exchange == null) {
077                return null;
078            }
079    
080            // must use java type with JMX such as java.lang.String
081            String body;
082            if (exchange.hasOut()) {
083                body = exchange.getOut().getBody(String.class);
084            } else {
085                body = exchange.getIn().getBody(String.class);
086            }
087    
088            return body;
089        }
090    
091        @Override
092        public String browseMessageAsXml(Integer index) {
093            return browseMessageAsXml(index, true);
094        }
095    
096        @Override
097        public String browseMessageAsXml(Integer index, Boolean includeBody) {
098            List<Exchange> exchanges = getEndpoint().getExchanges();
099    
100            if (index >= exchanges.size()) {
101                return null;
102            }
103            Exchange exchange = exchanges.get(index);
104            if (exchange == null) {
105                return null;
106            }
107    
108            Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
109            String xml = MessageHelper.dumpAsXml(msg, includeBody);
110    
111            return xml;
112        }
113    
114        @Override
115        public String browseAllMessagesAsXml(Boolean includeBody) {
116            return browseRangeMessagesAsXml(0, Integer.MAX_VALUE, includeBody);
117        }
118    
119        @Override
120        public String browseRangeMessagesAsXml(Integer fromIndex, Integer toIndex, Boolean includeBody) {
121            if (fromIndex == null) {
122                fromIndex = 0;
123            }
124            if (toIndex == null) {
125                toIndex = Integer.MAX_VALUE;
126            }
127            if (fromIndex > toIndex) {
128                throw new IllegalArgumentException("From index cannot be larger than to index, was: " + fromIndex + " > " + toIndex);
129            }
130    
131            List<Exchange> exchanges = getEndpoint().getExchanges();
132            if (exchanges.size() == 0) {
133                return null;
134            }
135    
136            StringBuilder sb = new StringBuilder();
137            sb.append("<messages>");
138            for (int i = fromIndex; i < exchanges.size() && i <= toIndex; i++) {
139                Exchange exchange = exchanges.get(i);
140                Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
141                String xml = MessageHelper.dumpAsXml(msg, includeBody);
142                sb.append("\n").append(xml);
143            }
144            sb.append("\n</messages>");
145            return sb.toString();
146        }
147    
148    }