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 * @see DefaultManagementStrategy
037 */
038public class ManagedManagementStrategy extends DefaultManagementStrategy {
039
040    public ManagedManagementStrategy() {
041    }
042
043    public ManagedManagementStrategy(CamelContext context, ManagementAgent managementAgent) {
044        super(context, managementAgent);
045        context.setExtension(
046                ManagedCamelContext.class,
047                new ManagedCamelContextImpl(context));
048        // must add management lifecycle strategy
049        context.getLifecycleStrategies().add(0, new DefaultManagementLifecycleStrategy(context));
050    }
051
052    public void manageObject(Object managedObject) throws Exception {
053        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
054        if (objectName != null) {
055            getManagementAgent().register(managedObject, objectName);
056        }
057    }
058
059    public void unmanageObject(Object managedObject) throws Exception {
060        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
061        if (objectName != null) {
062            getManagementAgent().unregister(objectName);
063        }
064    }
065
066    public boolean isManaged(Object managedObject) {
067        try {
068            ObjectName name = getManagementObjectNameStrategy().getObjectName(managedObject);
069            if (name != null) {
070                return getManagementAgent().isRegistered(name);
071            }
072        } catch (Exception e) {
073            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
074        }
075        return false;
076    }
077
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    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
101        return new DefaultManagementObjectNameStrategy(domain);
102    }
103
104    protected ManagementObjectStrategy createManagementObjectStrategy() {
105        return new DefaultManagementObjectStrategy();
106    }
107
108}