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.api.management.ManagedResource;
024import org.apache.camel.api.management.mbean.ManagedBacklogDebuggerMBean;
025import org.apache.camel.processor.interceptor.BacklogDebugger;
026import org.apache.camel.spi.Language;
027import org.apache.camel.spi.ManagementStrategy;
028import org.apache.camel.util.ObjectHelper;
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    public String getCamelId() {
054        return camelContext.getName();
055    }
056
057    public String getCamelManagementName() {
058        return camelContext.getManagementName();
059    }
060
061    public String getLoggingLevel() {
062        return backlogDebugger.getLoggingLevel();
063    }
064
065    public void setLoggingLevel(String level) {
066        backlogDebugger.setLoggingLevel(level);
067    }
068
069    public boolean isEnabled() {
070        return backlogDebugger.isEnabled();
071    }
072
073    public void enableDebugger() {
074        backlogDebugger.enableDebugger();
075    }
076
077    public void disableDebugger() {
078        backlogDebugger.disableDebugger();
079    }
080
081    public void addBreakpoint(String nodeId) {
082        backlogDebugger.addBreakpoint(nodeId);
083    }
084
085    public void addConditionalBreakpoint(String nodeId, String language, String predicate) {
086        backlogDebugger.addConditionalBreakpoint(nodeId, language, predicate);
087    }
088
089    public void removeBreakpoint(String nodeId) {
090        backlogDebugger.removeBreakpoint(nodeId);
091    }
092
093    public void removeAllBreakpoints() {
094        backlogDebugger.removeAllBreakpoints();
095    }
096
097    public Set<String> getBreakpoints() {
098        return backlogDebugger.getBreakpoints();
099    }
100
101    public void resumeBreakpoint(String nodeId) {
102        backlogDebugger.resumeBreakpoint(nodeId);
103    }
104
105    public void setMessageBodyOnBreakpoint(String nodeId, Object body) {
106        backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body);
107    }
108
109    public void setMessageBodyOnBreakpoint(String nodeId, Object body, String type) {
110        try {
111            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
112            backlogDebugger.setMessageBodyOnBreakpoint(nodeId, body, classType);
113        } catch (ClassNotFoundException e) {
114            throw ObjectHelper.wrapRuntimeCamelException(e);
115        }
116    }
117
118    public void removeMessageBodyOnBreakpoint(String nodeId) {
119        backlogDebugger.removeMessageBodyOnBreakpoint(nodeId);
120    }
121
122    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value) {
123        try {
124            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value);
125        } catch (NoTypeConversionAvailableException e) {
126            throw ObjectHelper.wrapRuntimeCamelException(e);
127        }
128    }
129
130    public void setMessageHeaderOnBreakpoint(String nodeId, String headerName, Object value, String type) {
131        try {
132            Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type);
133            backlogDebugger.setMessageHeaderOnBreakpoint(nodeId, headerName, value, classType);
134        } catch (Exception e) {
135            throw ObjectHelper.wrapRuntimeCamelException(e);
136        }
137    }
138
139    public void removeMessageHeaderOnBreakpoint(String nodeId, String headerName) {
140        backlogDebugger.removeMessageHeaderOnBreakpoint(nodeId, headerName);
141    }
142
143    public void resumeAll() {
144        backlogDebugger.resumeAll();
145    }
146
147    public void stepBreakpoint(String nodeId) {
148        backlogDebugger.stepBreakpoint(nodeId);
149    }
150
151    public boolean isSingleStepMode() {
152        return backlogDebugger.isSingleStepMode();
153    }
154
155    public void step() {
156        backlogDebugger.step();
157    }
158
159    public Set<String> getSuspendedBreakpointNodeIds() {
160        return backlogDebugger.getSuspendedBreakpointNodeIds();
161    }
162
163    public void disableBreakpoint(String nodeId) {
164        backlogDebugger.disableBreakpoint(nodeId);
165    }
166
167    public void enableBreakpoint(String nodeId) {
168        backlogDebugger.enableBreakpoint(nodeId);
169    }
170
171    public int getBodyMaxChars() {
172        return backlogDebugger.getBodyMaxChars();
173    }
174
175    public void setBodyMaxChars(int bodyMaxChars) {
176        backlogDebugger.setBodyMaxChars(bodyMaxChars);
177    }
178
179    public boolean isBodyIncludeStreams() {
180        return backlogDebugger.isBodyIncludeStreams();
181    }
182
183    public void setBodyIncludeStreams(boolean bodyIncludeStreams) {
184        backlogDebugger.setBodyIncludeStreams(bodyIncludeStreams);
185    }
186
187    public boolean isBodyIncludeFiles() {
188        return backlogDebugger.isBodyIncludeFiles();
189    }
190
191    public void setBodyIncludeFiles(boolean bodyIncludeFiles) {
192        backlogDebugger.setBodyIncludeFiles(bodyIncludeFiles);
193    }
194
195    public String dumpTracedMessagesAsXml(String nodeId) {
196        return backlogDebugger.dumpTracedMessagesAsXml(nodeId);
197    }
198
199    public long getDebugCounter() {
200        return backlogDebugger.getDebugCounter();
201    }
202
203    public void resetDebugCounter() {
204        backlogDebugger.resetDebugCounter();
205    }
206
207    public String validateConditionalBreakpoint(String language, String predicate) {
208        Language lan = null;
209        try {
210            lan = camelContext.resolveLanguage(language);
211            lan.createPredicate(predicate);
212            return null;
213        } catch (Exception e) {
214            if (lan == null) {
215                return e.getMessage();
216            } else {
217                return "Invalid syntax " + predicate + " due: " + e.getMessage();
218            }
219        }
220    }
221    
222    public long getFallbackTimeout() {
223        return backlogDebugger.getFallbackTimeout();
224    }
225   
226    public void setFallbackTimeout(long fallbackTimeout) {
227        backlogDebugger.setFallbackTimeout(fallbackTimeout);
228    }
229}