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 */
017package org.apache.camel.management.mbean;
018
019import java.util.List;
020
021import org.apache.camel.Exchange;
022import org.apache.camel.Message;
023import org.apache.camel.api.management.ManagedResource;
024import org.apache.camel.api.management.mbean.ManagedBrowsableEndpointMBean;
025import org.apache.camel.spi.BrowsableEndpoint;
026import org.apache.camel.support.MessageHelper;
027import org.apache.camel.util.json.JsonArray;
028import org.apache.camel.util.json.JsonObject;
029import org.apache.camel.util.json.Jsoner;
030
031@ManagedResource(description = "Managed BrowsableEndpoint")
032public 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 int getBrowseLimit() {
050        return getEndpoint().getBrowseLimit();
051    }
052
053    @Override
054    public int queueSize() {
055        return getEndpoint().getExchanges().size();
056    }
057
058    @Override
059    public String browseExchange(Integer index) {
060        List<Exchange> exchanges = getEndpoint().getExchanges();
061
062        if (index >= exchanges.size()) {
063            return null;
064        }
065        Exchange exchange = exchanges.get(index);
066        if (exchange == null) {
067            return null;
068        }
069        // must use java type with JMX such as java.lang.String
070        return exchange.toString();
071    }
072
073    @Override
074    public String browseMessageBody(Integer index) {
075        List<Exchange> exchanges = getEndpoint().getExchanges();
076
077        if (index >= exchanges.size()) {
078            return null;
079        }
080        Exchange exchange = exchanges.get(index);
081        if (exchange == null) {
082            return null;
083        }
084
085        Message msg = exchange.getMessage();
086        return MessageHelper.extractBodyAsString(msg);
087    }
088
089    @Override
090    public String browseMessageAsXml(Integer index, Boolean includeBody) {
091        List<Exchange> exchanges = getEndpoint().getExchanges();
092
093        if (index >= exchanges.size()) {
094            return null;
095        }
096        Exchange exchange = exchanges.get(index);
097        if (exchange == null) {
098            return null;
099        }
100
101        Message msg = exchange.getMessage();
102        return MessageHelper.dumpAsXml(msg, includeBody);
103    }
104
105    @Override
106    public String browseAllMessagesAsXml(Boolean includeBody) {
107        return browseRangeMessagesAsXml(0, Integer.MAX_VALUE, includeBody);
108    }
109
110    @Override
111    public String browseRangeMessagesAsXml(Integer fromIndex, Integer toIndex, Boolean includeBody) {
112        if (fromIndex == null) {
113            fromIndex = 0;
114        }
115        if (toIndex == null) {
116            toIndex = Integer.MAX_VALUE;
117        }
118        if (fromIndex > toIndex) {
119            throw new IllegalArgumentException(
120                    "From index cannot be larger than to index, was: " + fromIndex + " > " + toIndex);
121        }
122
123        List<Exchange> exchanges = getEndpoint().getExchanges();
124        if (exchanges.isEmpty()) {
125            return null;
126        }
127
128        StringBuilder sb = new StringBuilder();
129        sb.append("<messages>");
130        for (int i = fromIndex; i < exchanges.size() && i <= toIndex; i++) {
131            Exchange exchange = exchanges.get(i);
132            Message msg = exchange.getMessage();
133            String xml = MessageHelper.dumpAsXml(msg, includeBody);
134            sb.append("\n").append(xml);
135        }
136        sb.append("\n</messages>");
137        return sb.toString();
138    }
139
140    @Override
141    public String browseMessageAsJSon(Integer index, Boolean includeBody) {
142        List<Exchange> exchanges = getEndpoint().getExchanges();
143
144        if (index >= exchanges.size()) {
145            return null;
146        }
147        Exchange exchange = exchanges.get(index);
148        if (exchange == null) {
149            return null;
150        }
151
152        Message msg = exchange.getMessage();
153        return MessageHelper.dumpAsJSon(msg, includeBody);
154    }
155
156    @Override
157    public String browseAllMessagesAsJSon(Boolean includeBody) {
158        return browseRangeMessagesAsJSon(0, Integer.MAX_VALUE, includeBody);
159    }
160
161    @Override
162    public String browseRangeMessagesAsJSon(Integer fromIndex, Integer toIndex, Boolean includeBody) {
163        if (fromIndex == null) {
164            fromIndex = 0;
165        }
166        if (toIndex == null) {
167            toIndex = Integer.MAX_VALUE;
168        }
169        if (fromIndex > toIndex) {
170            throw new IllegalArgumentException(
171                    "From index cannot be larger than to index, was: " + fromIndex + " > " + toIndex);
172        }
173
174        List<Exchange> exchanges = getEndpoint().getExchanges();
175        if (exchanges.isEmpty()) {
176            return null;
177        }
178
179        JsonArray arr = new JsonArray();
180        for (int i = fromIndex; i < exchanges.size() && i <= toIndex; i++) {
181            Exchange exchange = exchanges.get(i);
182            Message msg = exchange.getMessage();
183            JsonObject jo = MessageHelper.dumpAsJSonObject(msg, false, false, includeBody, true, true, true, 128 * 1024);
184            arr.add(jo);
185        }
186        String out = arr.toJson();
187        return Jsoner.prettyPrint(out);
188    }
189}