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;
018
019import javax.management.ObjectName;
020
021import org.apache.camel.CamelContext;
022import org.apache.camel.Endpoint;
023import org.apache.camel.management.mbean.ManagedBacklogDebugger;
024import org.apache.camel.management.mbean.ManagedBacklogTracer;
025import org.apache.camel.management.mbean.ManagedCamelContext;
026import org.apache.camel.management.mbean.ManagedComponent;
027import org.apache.camel.management.mbean.ManagedConsumer;
028import org.apache.camel.management.mbean.ManagedDataFormat;
029import org.apache.camel.management.mbean.ManagedEndpoint;
030import org.apache.camel.management.mbean.ManagedErrorHandler;
031import org.apache.camel.management.mbean.ManagedEventNotifier;
032import org.apache.camel.management.mbean.ManagedProcessor;
033import org.apache.camel.management.mbean.ManagedProducer;
034import org.apache.camel.management.mbean.ManagedRoute;
035import org.apache.camel.management.mbean.ManagedRuntimeCamelCatalog;
036import org.apache.camel.management.mbean.ManagedService;
037import org.apache.camel.management.mbean.ManagedThreadPool;
038import org.apache.camel.management.mbean.ManagedTracer;
039import org.apache.camel.model.ProcessorDefinition;
040import org.apache.camel.spi.ManagementAgent;
041import org.slf4j.Logger;
042import org.slf4j.LoggerFactory;
043
044/**
045 * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
046 * <p/>
047 * Camel detects whether its possible to use this JMX capable strategy and if <b>not</b> then Camel
048 * will fallback to the {@link org.apache.camel.management.DefaultManagementStrategy} instead.
049 *
050 * @see org.apache.camel.spi.ManagementStrategy
051 * @see org.apache.camel.management.DefaultManagementStrategy
052 * @version 
053 */
054public class ManagedManagementStrategy extends DefaultManagementStrategy {
055
056    private static final Logger LOG = LoggerFactory.getLogger(ManagedManagementStrategy.class);
057
058    public ManagedManagementStrategy() {
059    }
060
061    @Deprecated
062    public ManagedManagementStrategy(ManagementAgent managementAgent) {
063        setManagementAgent(managementAgent);
064    }
065
066    public ManagedManagementStrategy(CamelContext camelContext, ManagementAgent managementAgent) {
067        setCamelContext(camelContext);
068        setManagementAgent(managementAgent);
069    }
070
071    public void manageObject(Object managedObject) throws Exception {
072        manageNamedObject(managedObject, null);
073    }
074
075    public void manageNamedObject(Object managedObject, Object preferredName) throws Exception {
076        ObjectName objectName = getObjectName(managedObject, preferredName);
077
078        if (objectName != null) {
079            getManagementAgent().register(managedObject, objectName);
080        }
081    }
082
083    public <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception {
084        if (managedObject == null) {
085            return null;
086        }
087
088        ObjectName objectName = null;
089
090        if (managedObject instanceof ManagedCamelContext) {
091            ManagedCamelContext mcc = (ManagedCamelContext) managedObject;
092            objectName = getManagementNamingStrategy().getObjectNameForCamelContext(mcc.getContext());
093        } else if (managedObject instanceof ManagedComponent) {
094            ManagedComponent mc = (ManagedComponent) managedObject;
095            objectName = getManagementNamingStrategy().getObjectNameForComponent(mc.getComponent(), mc.getComponentName());
096        } else if (managedObject instanceof ManagedDataFormat) {
097            ManagedDataFormat md = (ManagedDataFormat) managedObject;
098            objectName = getManagementNamingStrategy().getObjectNameForDataFormat(md.getContext(), md.getDataFormat());
099        } else if (managedObject instanceof ManagedEndpoint) {
100            ManagedEndpoint me = (ManagedEndpoint) managedObject;
101            objectName = getManagementNamingStrategy().getObjectNameForEndpoint(me.getEndpoint());
102        } else if (managedObject instanceof Endpoint) {
103            objectName = getManagementNamingStrategy().getObjectNameForEndpoint((Endpoint) managedObject);
104        } else if (managedObject instanceof ManagedRoute) {
105            ManagedRoute mr = (ManagedRoute) managedObject;
106            objectName = getManagementNamingStrategy().getObjectNameForRoute(mr.getRoute());
107        } else if (managedObject instanceof ManagedErrorHandler) {
108            ManagedErrorHandler meh = (ManagedErrorHandler) managedObject;
109            objectName = getManagementNamingStrategy().getObjectNameForErrorHandler(meh.getRouteContext(), meh.getErrorHandler(), meh.getErrorHandlerBuilder());
110        } else if (managedObject instanceof ManagedProcessor) {
111            ManagedProcessor mp = (ManagedProcessor) managedObject;
112            objectName = getManagementNamingStrategy().getObjectNameForProcessor(mp.getContext(), mp.getProcessor(), mp.getDefinition());
113        } else if (managedObject instanceof ManagedConsumer) {
114            ManagedConsumer ms = (ManagedConsumer) managedObject;
115            objectName = getManagementNamingStrategy().getObjectNameForConsumer(ms.getContext(), ms.getConsumer());
116        } else if (managedObject instanceof ManagedProducer) {
117            ManagedProducer ms = (ManagedProducer) managedObject;
118            objectName = getManagementNamingStrategy().getObjectNameForProducer(ms.getContext(), ms.getProducer());
119        } else if (managedObject instanceof ManagedTracer) {
120            ManagedTracer mt = (ManagedTracer) managedObject;
121            objectName = getManagementNamingStrategy().getObjectNameForTracer(mt.getContext(), mt.getTracer());
122        } else if (managedObject instanceof ManagedBacklogTracer) {
123            ManagedBacklogTracer mt = (ManagedBacklogTracer) managedObject;
124            objectName = getManagementNamingStrategy().getObjectNameForTracer(mt.getContext(), mt.getBacklogTracer());
125        } else if (managedObject instanceof ManagedBacklogDebugger) {
126            ManagedBacklogDebugger md = (ManagedBacklogDebugger) managedObject;
127            objectName = getManagementNamingStrategy().getObjectNameForTracer(md.getContext(), md.getBacklogDebugger());
128        } else if (managedObject instanceof ManagedEventNotifier) {
129            ManagedEventNotifier men = (ManagedEventNotifier) managedObject;
130            objectName = getManagementNamingStrategy().getObjectNameForEventNotifier(men.getContext(), men.getEventNotifier());
131        } else if (managedObject instanceof ManagedThreadPool) {
132            ManagedThreadPool mes = (ManagedThreadPool) managedObject;
133            objectName = getManagementNamingStrategy().getObjectNameForThreadPool(mes.getContext(), mes.getThreadPool(), mes.getId(), mes.getSourceId());
134        } else if (managedObject instanceof ManagedService) {
135            // check for managed service should be last
136            ManagedService ms = (ManagedService) managedObject;
137            // skip endpoints as they are already managed
138            if (ms.getService() instanceof Endpoint) {
139                return null;
140            }
141            objectName = getManagementNamingStrategy().getObjectNameForService(ms.getContext(), ms.getService());
142        }
143
144        return nameType.cast(objectName);
145    }
146
147    public void unmanageObject(Object managedObject) throws Exception {
148        ObjectName objectName = getManagedObjectName(managedObject, null, ObjectName.class);
149        unmanageNamedObject(objectName);
150    }
151
152    public void unmanageNamedObject(Object name) throws Exception {
153        ObjectName objectName = getObjectName(null, name);
154        if (objectName != null) {
155            getManagementAgent().unregister(objectName);
156        }
157    }
158
159    public boolean isManaged(Object managedObject, Object name) {
160        try {
161            ObjectName objectName = getObjectName(managedObject, name);
162            if (objectName != null) {
163                return getManagementAgent().isRegistered(objectName);
164            }
165        } catch (Exception e) {
166            LOG.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
167        }
168        return false;
169    }
170
171    @Override
172    public boolean manageProcessor(ProcessorDefinition<?> definition) {
173        return true;
174    }
175
176    private ObjectName getObjectName(Object managedObject, Object preferedName) throws Exception {
177        ObjectName objectName;
178
179        if (preferedName != null && preferedName instanceof String) {
180            String customName = (String) preferedName;
181            objectName = getManagedObjectName(managedObject, customName, ObjectName.class);
182        } else if (preferedName != null && preferedName instanceof ObjectName) {
183            objectName = (ObjectName) preferedName;
184        } else {
185            objectName = getManagedObjectName(managedObject, null, ObjectName.class);
186        }
187        return objectName;
188    }
189
190    @Override
191    protected void doStart() throws Exception {
192        LOG.info("JMX is enabled");
193        doStartManagementStrategy();
194    }
195
196}