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.engine.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    @Override
049    public void manageObject(Object managedObject) throws Exception {
050        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
051        if (objectName != null) {
052            getManagementAgent().register(managedObject, objectName);
053        }
054    }
055
056    @Override
057    public void unmanageObject(Object managedObject) throws Exception {
058        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
059        if (objectName != null) {
060            getManagementAgent().unregister(objectName);
061        }
062    }
063
064    @Override
065    public boolean isManaged(Object managedObject) {
066        try {
067            ObjectName name = getManagementObjectNameStrategy().getObjectName(managedObject);
068            if (name != null) {
069                return getManagementAgent().isRegistered(name);
070            }
071        } catch (Exception e) {
072            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
073        }
074        return false;
075    }
076
077    @Override
078    public boolean isManagedName(Object name) {
079        try {
080            if (name instanceof ObjectName) {
081                return getManagementAgent().isRegistered((ObjectName) name);
082            }
083        } catch (Exception e) {
084            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
085        }
086        return false;
087    }
088
089    @Override
090    public boolean manageProcessor(NamedNode definition) {
091        return true;
092    }
093
094    @Override
095    protected void doStart() throws Exception {
096        log.info("JMX is enabled");
097        doStartManagementStrategy();
098    }
099
100    @Override
101    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
102        return new DefaultManagementObjectNameStrategy(domain);
103    }
104
105    @Override
106    protected ManagementObjectStrategy createManagementObjectStrategy() {
107        return new DefaultManagementObjectStrategy();
108    }
109
110}