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.Set;
020
021import org.apache.camel.CamelContext;
022import org.apache.camel.NoTypeConversionAvailableException;
023import org.apache.camel.RuntimeCamelException;
024import org.apache.camel.api.management.ManagedResource;
025import org.apache.camel.api.management.mbean.ManagedBacklogDebuggerMBean;
026import org.apache.camel.impl.debugger.BacklogDebugger;
027import org.apache.camel.spi.Language;
028import org.apache.camel.spi.ManagementStrategy;
029
030@ManagedResource(description = "Managed BacklogDebugger")
031public class ManagedBacklogDebugger implements ManagedBacklogDebuggerMBean {
032
033    private final CamelContext camelContext;
034    private final BacklogDebugger backlogDebugger;
035
036    public ManagedBacklogDebugger(CamelContext camelContext, BacklogDebugger backlogDebugger) {
037        this.camelContext = camelContext;
038        this.backlogDebugger = backlogDebugger;
039    }
040
041    public void init(ManagementStrategy strategy) {
042        // do nothing
043    }
044
045    public CamelContext getContext() {
046        return camelContext;
047    }
048
049    public BacklogDebugger getBacklogDebugger() {
050        return backlogDebugger;
051    }
052
053    @Override
054    public String getCamelId() {
055        return camelContext.getName();
056    }
057
058    @Override
059    public String getCamelManagementName() {
060        return camelContext.getManagementName();
061    }
062
063    @Override
064    public String getLoggingLevel() {
065        return backlogDebugger.getLoggingLevel();
066    }
067
068    @Override
069    public void setLoggingLevel(String level) {
070        backlogDebugger.setLoggingLevel(level);
071    }
072
073    @Override
074    public boolean isEnabled() {
075        return backlogDebugger.isEnabled();
076    }
077
078    @Override
079    public void enableDebugger() {
080        backlogDebugger.enableDebugger();
081    }
082
083    @Override
084    public void disableDebugger() {
085        backlogDebugger.disableDebugger();
086    }
087
088    @Override
089    public void addBreakpoint(String nodeId) {
090        backlogDebugger.addBreakpoint(nodeId);
091    }
092
093    @Override
094    public void addConditionalBreakpoint(String nodeId, String language, String predicate) {
095        backlogDebugger.addConditionalBreakpoint(nodeId, language, predicate);
096    }
097
098    @Override
099    public void removeBreakpoint(String nodeId) {
100        backlogDebugger.removeBreakpoint(nodeId);
101    }
102
103    @Override
104    public void removeAllBreakpoints() {
105        backlogDebugger.removeAllBreakpoints();
106    }
107
108    @Override
109    public Set<String> getBreakpoints() {
110        return breakpoints();
111    }
112
113    @Override
114    public Set<String> breakpoints() {
115        return backlogDebugger.getBreakpoints();
116    }
117
118    @Override
119    public void resumeBreakpoint(String nodeId) {
120        backlogDebugger.resumeBreakpoint(nodeId);
121    }
122
123    @Override
124    public void setMessageBodyOnBreakpoint(String nodeId, Object body) {
125        backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body);
126    }
127
128    @Override
129    public void setMessageBodyOnBreakpoint(String nodeId, Object body, String type) {
130        try {
131            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
132            backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body, classType);
133        } catch (ClassNotFoundException e) {
134            throw RuntimeCamelException.wrapRuntimeCamelException(e);
135        }
136    }
137
138    @Override
139    public void removeMessageBodyOnBreakpoint(String nodeId) {
140        backlogDebugger.removeMessageBodyOnBreakpoint(nodeId);
141    }
142
143    @Override
144    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value) {
145        try {
146            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value);
147        } catch (NoTypeConversionAvailableException e) {
148            throw RuntimeCamelException.wrapRuntimeCamelException(e);
149        }
150    }
151
152    @Override
153    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value, String type) {
154        try {
155            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
156            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value, classType);
157        } catch (Exception e) {
158            throw RuntimeCamelException.wrapRuntimeCamelException(e);
159        }
160    }
161
162    @Override
163    public void removeMessageHeaderOnBreakpoint(String nodeId, String headerName) {
164        backlogDebugger.removeMessageHeaderOnBreakpoint(nodeId, headerName);
165    }
166
167    @Override
168    public void resumeAll() {
169        backlogDebugger.resumeAll();
170    }
171
172    @Override
173    public void stepBreakpoint(String nodeId) {
174        backlogDebugger.stepBreakpoint(nodeId);
175    }
176
177    @Override
178    public boolean isSingleStepMode() {
179        return backlogDebugger.isSingleStepMode();
180    }
181
182    @Override
183    public void step() {
184        backlogDebugger.step();
185    }
186
187    @Override
188    public Set<String> getSuspendedBreakpointNodeIds() {
189        return suspendedBreakpointNodeIds();
190    }
191
192    @Override
193    public Set<String> suspendedBreakpointNodeIds() {
194        return backlogDebugger.getSuspendedBreakpointNodeIds();
195    }
196
197    @Override
198    public void disableBreakpoint(String nodeId) {
199        backlogDebugger.disableBreakpoint(nodeId);
200    }
201
202    @Override
203    public void enableBreakpoint(String nodeId) {
204        backlogDebugger.enableBreakpoint(nodeId);
205    }
206
207    @Override
208    public int getBodyMaxChars() {
209        return backlogDebugger.getBodyMaxChars();
210    }
211
212    @Override
213    public void setBodyMaxChars(int bodyMaxChars) {
214        backlogDebugger.setBodyMaxChars(bodyMaxChars);
215    }
216
217    @Override
218    public boolean isBodyIncludeStreams() {
219        return backlogDebugger.isBodyIncludeStreams();
220    }
221
222    @Override
223    public void setBodyIncludeStreams(boolean bodyIncludeStreams) {
224        backlogDebugger.setBodyIncludeStreams(bodyIncludeStreams);
225    }
226
227    @Override
228    public boolean isBodyIncludeFiles() {
229        return backlogDebugger.isBodyIncludeFiles();
230    }
231
232    @Override
233    public void setBodyIncludeFiles(boolean bodyIncludeFiles) {
234        backlogDebugger.setBodyIncludeFiles(bodyIncludeFiles);
235    }
236
237    @Override
238    public String dumpTracedMessagesAsXml(String nodeId) {
239        return backlogDebugger.dumpTracedMessagesAsXml(nodeId);
240    }
241
242    @Override
243    public long getDebugCounter() {
244        return backlogDebugger.getDebugCounter();
245    }
246
247    @Override
248    public void resetDebugCounter() {
249        backlogDebugger.resetDebugCounter();
250    }
251
252    @Override
253    public String validateConditionalBreakpoint(String language, String predicate) {
254        Language lan = null;
255        try {
256            lan = camelContext.resolveLanguage(language);
257            lan.createPredicate(predicate);
258            return null;
259        } catch (Exception e) {
260            if (lan == null) {
261                return e.getMessage();
262            } else {
263                return "Invalid syntax " + predicate + " due: " + e.getMessage();
264            }
265        }
266    }
267
268    @Override
269    public long getFallbackTimeout() {
270        return backlogDebugger.getFallbackTimeout();
271    }
272
273    @Override
274    public void setFallbackTimeout(long fallbackTimeout) {
275        backlogDebugger.setFallbackTimeout(fallbackTimeout);
276    }
277}