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.NamedNode;
023import org.apache.camel.api.management.ManagedCamelContext;
024import org.apache.camel.impl.DefaultManagementStrategy;
025import org.apache.camel.spi.ManagementAgent;
026import org.apache.camel.spi.ManagementObjectNameStrategy;
027import org.apache.camel.spi.ManagementObjectStrategy;
028
029/**
030 * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
031 * <p/>
032 * Camel detects whether its possible to use this JMX capable strategy and if <b>not</b> then Camel
033 * will fallback to the {@link DefaultManagementStrategy} instead.
034 *
035 * @see org.apache.camel.spi.ManagementStrategy
036 */
037public class JmxManagementStrategy extends DefaultManagementStrategy {
038
039    public JmxManagementStrategy() {
040    }
041
042    public JmxManagementStrategy(CamelContext context, ManagementAgent managementAgent) {
043        super(context, managementAgent);
044        // add JMX capable CamelContext as extension
045        context.setExtension(ManagedCamelContext.class, new ManagedCamelContextImpl(context));
046    }
047
048    public void manageObject(Object managedObject) throws Exception {
049        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
050        if (objectName != null) {
051            getManagementAgent().register(managedObject, objectName);
052        }
053    }
054
055    public void unmanageObject(Object managedObject) throws Exception {
056        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
057        if (objectName != null) {
058            getManagementAgent().unregister(objectName);
059        }
060    }
061
062    public boolean isManaged(Object managedObject) {
063        try {
064            ObjectName name = getManagementObjectNameStrategy().getObjectName(managedObject);
065            if (name != null) {
066                return getManagementAgent().isRegistered(name);
067            }
068        } catch (Exception e) {
069            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
070        }
071        return false;
072    }
073
074    public boolean isManagedName(Object name) {
075        try {
076            if (name instanceof ObjectName) {
077                return getManagementAgent().isRegistered((ObjectName) name);
078            }
079        } catch (Exception e) {
080            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
081        }
082        return false;
083    }
084
085    @Override
086    public boolean manageProcessor(NamedNode definition) {
087        return true;
088    }
089
090    @Override
091    protected void doStart() throws Exception {
092        log.info("JMX is enabled");
093        doStartManagementStrategy();
094    }
095
096    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
097        return new DefaultManagementObjectNameStrategy(domain);
098    }
099
100    protected ManagementObjectStrategy createManagementObjectStrategy() {
101        return new DefaultManagementObjectStrategy();
102    }
103
104}