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 backlogDebugger.getBreakpoints();
111    }
112
113    @Override
114    public void resumeBreakpoint(String nodeId) {
115        backlogDebugger.resumeBreakpoint(nodeId);
116    }
117
118    @Override
119    public void setMessageBodyOnBreakpoint(String nodeId, Object body) {
120        backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body);
121    }
122
123    @Override
124    public void setMessageBodyOnBreakpoint(String nodeId, Object body, String type) {
125        try {
126            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
127            backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body, classType);
128        } catch (ClassNotFoundException e) {
129            throw RuntimeCamelException.wrapRuntimeCamelException(e);
130        }
131    }
132
133    @Override
134    public void removeMessageBodyOnBreakpoint(String nodeId) {
135        backlogDebugger.removeMessageBodyOnBreakpoint(nodeId);
136    }
137
138    @Override
139    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value) {
140        try {
141            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value);
142        } catch (NoTypeConversionAvailableException e) {
143            throw RuntimeCamelException.wrapRuntimeCamelException(e);
144        }
145    }
146
147    @Override
148    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value, String type) {
149        try {
150            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
151            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value, classType);
152        } catch (Exception e) {
153            throw RuntimeCamelException.wrapRuntimeCamelException(e);
154        }
155    }
156
157    @Override
158    public void removeMessageHeaderOnBreakpoint(String nodeId, String headerName) {
159        backlogDebugger.removeMessageHeaderOnBreakpoint(nodeId, headerName);
160    }
161
162    @Override
163    public void resumeAll() {
164        backlogDebugger.resumeAll();
165    }
166
167    @Override
168    public void stepBreakpoint(String nodeId) {
169        backlogDebugger.stepBreakpoint(nodeId);
170    }
171
172    @Override
173    public boolean isSingleStepMode() {
174        return backlogDebugger.isSingleStepMode();
175    }
176
177    @Override
178    public void step() {
179        backlogDebugger.step();
180    }
181
182    @Override
183    public Set<String> getSuspendedBreakpointNodeIds() {
184        return backlogDebugger.getSuspendedBreakpointNodeIds();
185    }
186
187    @Override
188    public void disableBreakpoint(String nodeId) {
189        backlogDebugger.disableBreakpoint(nodeId);
190    }
191
192    @Override
193    public void enableBreakpoint(String nodeId) {
194        backlogDebugger.enableBreakpoint(nodeId);
195    }
196
197    @Override
198    public int getBodyMaxChars() {
199        return backlogDebugger.getBodyMaxChars();
200    }
201
202    @Override
203    public void setBodyMaxChars(int bodyMaxChars) {
204        backlogDebugger.setBodyMaxChars(bodyMaxChars);
205    }
206
207    @Override
208    public boolean isBodyIncludeStreams() {
209        return backlogDebugger.isBodyIncludeStreams();
210    }
211
212    @Override
213    public void setBodyIncludeStreams(boolean bodyIncludeStreams) {
214        backlogDebugger.setBodyIncludeStreams(bodyIncludeStreams);
215    }
216
217    @Override
218    public boolean isBodyIncludeFiles() {
219        return backlogDebugger.isBodyIncludeFiles();
220    }
221
222    @Override
223    public void setBodyIncludeFiles(boolean bodyIncludeFiles) {
224        backlogDebugger.setBodyIncludeFiles(bodyIncludeFiles);
225    }
226
227    @Override
228    public String dumpTracedMessagesAsXml(String nodeId) {
229        return backlogDebugger.dumpTracedMessagesAsXml(nodeId);
230    }
231
232    @Override
233    public long getDebugCounter() {
234        return backlogDebugger.getDebugCounter();
235    }
236
237    @Override
238    public void resetDebugCounter() {
239        backlogDebugger.resetDebugCounter();
240    }
241
242    @Override
243    public String validateConditionalBreakpoint(String language, String predicate) {
244        Language lan = null;
245        try {
246            lan = camelContext.resolveLanguage(language);
247            lan.createPredicate(predicate);
248            return null;
249        } catch (Exception e) {
250            if (lan == null) {
251                return e.getMessage();
252            } else {
253                return "Invalid syntax " + predicate + " due: " + e.getMessage();
254            }
255        }
256    }
257
258    @Override
259    public long getFallbackTimeout() {
260        return backlogDebugger.getFallbackTimeout();
261    }
262
263    @Override
264    public void setFallbackTimeout(long fallbackTimeout) {
265        backlogDebugger.setFallbackTimeout(fallbackTimeout);
266    }
267}