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     */
017    package org.apache.camel.management;
018    
019    import javax.management.ObjectName;
020    
021    import org.apache.camel.Endpoint;
022    import org.apache.camel.management.mbean.ManagedCamelContext;
023    import org.apache.camel.management.mbean.ManagedComponent;
024    import org.apache.camel.management.mbean.ManagedConsumer;
025    import org.apache.camel.management.mbean.ManagedEndpoint;
026    import org.apache.camel.management.mbean.ManagedErrorHandler;
027    import org.apache.camel.management.mbean.ManagedProcessor;
028    import org.apache.camel.management.mbean.ManagedProducer;
029    import org.apache.camel.management.mbean.ManagedRoute;
030    import org.apache.camel.management.mbean.ManagedService;
031    import org.apache.camel.management.mbean.ManagedTracer;
032    import org.apache.camel.model.ProcessorDefinition;
033    import org.apache.camel.spi.ManagementAgent;
034    import org.apache.commons.logging.Log;
035    import org.apache.commons.logging.LogFactory;
036    import org.fusesource.commons.management.Statistic;
037    import org.fusesource.commons.management.basic.StatisticImpl;
038    
039    /**
040     * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
041     * <p/>
042     * Camel detects whether its possible to use this JMX capable strategy and if <b>not</b> then Camel
043     * will fallback to the {@link org.apache.camel.management.DefaultManagementStrategy} instead.
044     *
045     * @see org.apache.camel.spi.ManagementStrategy
046     * @see org.apache.camel.management.DefaultManagementStrategy
047     * @version $Revision: 835593 $
048     */
049    public class ManagedManagementStrategy extends DefaultManagementStrategy {
050    
051        private static final Log LOG = LogFactory.getLog(ManagedManagementStrategy.class);
052    
053        public ManagedManagementStrategy() {
054            this(new DefaultManagementAgent());
055        }
056    
057        public ManagedManagementStrategy(ManagementAgent managementAgent) {
058            setManagementAgent(managementAgent);
059        }
060    
061        public void manageObject(Object managedObject) throws Exception {
062            manageNamedObject(managedObject, null);
063        }
064    
065        public void manageNamedObject(Object managedObject, Object preferedName) throws Exception {
066            ObjectName objectName = getObjectName(managedObject, preferedName);
067    
068            if (objectName != null) {
069                getManagementAgent().register(managedObject, objectName);
070            }
071        }
072    
073        public <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception {
074            if (managedObject == null) {
075                return null;
076            }
077    
078            ObjectName objectName = null;
079    
080            if (managedObject instanceof ManagedCamelContext) {
081                ManagedCamelContext mcc = (ManagedCamelContext) managedObject;
082                objectName = getManagementNamingStrategy().getObjectNameForCamelContext(mcc.getContext());
083            } else if (managedObject instanceof ManagedComponent) {
084                ManagedComponent mc = (ManagedComponent) managedObject;
085                objectName = getManagementNamingStrategy().getObjectNameForComponent(mc.getComponent(), mc.getComponentName());
086            } else if (managedObject instanceof ManagedEndpoint) {
087                ManagedEndpoint me = (ManagedEndpoint) managedObject;
088                objectName = getManagementNamingStrategy().getObjectNameForEndpoint(me.getEndpoint());
089            } else if (managedObject instanceof Endpoint) {
090                objectName = getManagementNamingStrategy().getObjectNameForEndpoint((Endpoint) managedObject);
091            } else if (managedObject instanceof ManagedRoute) {
092                ManagedRoute mr = (ManagedRoute) managedObject;
093                objectName = getManagementNamingStrategy().getObjectNameForRoute(mr.getRoute());
094            } else if (managedObject instanceof ManagedErrorHandler) {
095                ManagedErrorHandler meh = (ManagedErrorHandler) managedObject;
096                objectName = getManagementNamingStrategy().getObjectNameForErrorHandler(meh.getRouteContext(), meh.getErrorHandler(), meh.getErrorHandlerBuilder());
097            } else if (managedObject instanceof ManagedProcessor) {
098                ManagedProcessor mp = (ManagedProcessor) managedObject;
099                objectName = getManagementNamingStrategy().getObjectNameForProcessor(mp.getContext(), mp.getProcessor(), mp.getDefinition());
100            } else if (managedObject instanceof ManagedConsumer) {
101                ManagedConsumer ms = (ManagedConsumer) managedObject;
102                objectName = getManagementNamingStrategy().getObjectNameForConsumer(ms.getContext(), ms.getConsumer());
103            } else if (managedObject instanceof ManagedProducer) {
104                ManagedProducer ms = (ManagedProducer) managedObject;
105                objectName = getManagementNamingStrategy().getObjectNameForProducer(ms.getContext(), ms.getProducer());
106            } else if (managedObject instanceof ManagedTracer) {
107                ManagedTracer mt = (ManagedTracer) managedObject;
108                objectName = getManagementNamingStrategy().getObjectNameForTracer(mt.getCamelContext(), mt.getTracer());
109            } else if (managedObject instanceof ManagedService) {
110                // check for managed service should be last
111                ManagedService ms = (ManagedService) managedObject;
112                objectName = getManagementNamingStrategy().getObjectNameForService(ms.getContext(), ms.getService());
113            }
114    
115            return nameType.cast(objectName);
116        }
117    
118        public void unmanageObject(Object managedObject) throws Exception {
119            ObjectName objectName = getManagedObjectName(managedObject, null, ObjectName.class);
120            unmanageNamedObject(objectName);
121        }
122    
123        public void unmanageNamedObject(Object name) throws Exception {
124            ObjectName objectName = getObjectName(null, name);
125            if (objectName != null) {
126                getManagementAgent().unregister(objectName);
127            }
128        }
129    
130        public boolean isManaged(Object managableObject, Object name) {
131            try {
132                ObjectName objectName = getObjectName(managableObject, name);
133                if (objectName != null) {
134                    return getManagementAgent().isRegistered(objectName);
135                }
136            } catch (Exception e) {
137                LOG.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
138            }
139            return false;
140        }
141    
142        @Override
143        public boolean manageProcessor(ProcessorDefinition<?> definition) {
144            return true;
145        }
146    
147        @Override
148        public Statistic createStatistic(String name, Object owner, Statistic.UpdateMode updateMode) {
149            return new StatisticImpl(updateMode);
150        }
151    
152        private ObjectName getObjectName(Object managedObject, Object preferedName) throws Exception {
153            ObjectName objectName;
154    
155            if (preferedName != null && preferedName instanceof String) {
156                String customName = (String) preferedName;
157                objectName = getManagedObjectName(managedObject, customName, ObjectName.class);
158            } else if (preferedName != null && preferedName instanceof ObjectName) {
159                objectName = (ObjectName) preferedName;
160            } else {
161                objectName = getManagedObjectName(managedObject, null, ObjectName.class);
162            }
163            return objectName;
164        }
165    
166    }