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 java.util.EventObject;
020    import java.util.List;
021    import java.util.concurrent.CopyOnWriteArrayList;
022    
023    import org.apache.camel.CamelContext;
024    import org.apache.camel.CamelContextAware;
025    import org.apache.camel.ManagementStatisticsLevel;
026    import org.apache.camel.management.event.DefaultEventFactory;
027    import org.apache.camel.management.mbean.Statistic;
028    import org.apache.camel.model.ProcessorDefinition;
029    import org.apache.camel.spi.EventFactory;
030    import org.apache.camel.spi.EventNotifier;
031    import org.apache.camel.spi.ManagementAgent;
032    import org.apache.camel.spi.ManagementNamingStrategy;
033    import org.apache.camel.spi.ManagementObjectStrategy;
034    import org.apache.camel.spi.ManagementStrategy;
035    import org.apache.camel.support.ServiceSupport;
036    import org.apache.camel.util.ObjectHelper;
037    import org.apache.camel.util.ServiceHelper;
038    import org.slf4j.Logger;
039    import org.slf4j.LoggerFactory;
040    
041    /**
042     * A default management strategy that does <b>not</b> manage.
043     * <p/>
044     * This is default only used if Camel detects that it cannot use the JMX capable
045     * {@link org.apache.camel.management.ManagedManagementStrategy} strategy. Then Camel will
046     * fallback to use this instead that is basically a simple and <tt>noop</tt> strategy.
047     * <p/>
048     * This class can also be used to extend your custom management implement. In fact the JMX capable
049     * provided by Camel extends this class as well.
050     *
051     * @see ManagedManagementStrategy
052     * @version 
053     */
054    public class DefaultManagementStrategy extends ServiceSupport implements ManagementStrategy, CamelContextAware {
055    
056        private static final Logger LOG = LoggerFactory.getLogger(DefaultManagementStrategy.class);
057        private List<EventNotifier> eventNotifiers = new CopyOnWriteArrayList<EventNotifier>();
058        private EventFactory eventFactory = new DefaultEventFactory();
059        private ManagementNamingStrategy managementNamingStrategy;
060        private ManagementObjectStrategy managementObjectStrategy;
061        private boolean onlyManageProcessorWithCustomId;
062        private ManagementAgent managementAgent;
063        private ManagementStatisticsLevel statisticsLevel = ManagementStatisticsLevel.All;
064        private boolean loadStatisticsEnabled;
065        private CamelContext camelContext;
066    
067        public DefaultManagementStrategy() {
068        }
069    
070        public DefaultManagementStrategy(CamelContext camelContext) {
071            this.camelContext = camelContext;
072        }
073    
074        public List<EventNotifier> getEventNotifiers() {
075            return eventNotifiers;
076        }
077    
078        public void addEventNotifier(EventNotifier eventNotifier) {
079            this.eventNotifiers.add(eventNotifier);
080        }
081    
082        public boolean removeEventNotifier(EventNotifier eventNotifier) {
083            return eventNotifiers.remove(eventNotifier);
084        }
085    
086        public void setEventNotifiers(List<EventNotifier> eventNotifiers) {
087            this.eventNotifiers = eventNotifiers;
088        }
089    
090        public EventFactory getEventFactory() {
091            return eventFactory;
092        }
093    
094        public void setEventFactory(EventFactory eventFactory) {
095            this.eventFactory = eventFactory;
096        }
097    
098        public ManagementNamingStrategy getManagementNamingStrategy() {
099            if (managementNamingStrategy == null) {
100                managementNamingStrategy = new DefaultManagementNamingStrategy();
101            }
102            return managementNamingStrategy;
103        }
104    
105        public void setManagementNamingStrategy(ManagementNamingStrategy managementNamingStrategy) {
106            this.managementNamingStrategy = managementNamingStrategy;
107        }
108    
109        public ManagementObjectStrategy getManagementObjectStrategy() {
110            if (managementObjectStrategy == null) {
111                managementObjectStrategy = new DefaultManagementObjectStrategy();
112            }
113            return managementObjectStrategy;
114        }
115    
116        public void setManagementObjectStrategy(ManagementObjectStrategy managementObjectStrategy) {
117            this.managementObjectStrategy = managementObjectStrategy;
118        }
119    
120        public ManagementAgent getManagementAgent() {
121            return managementAgent;
122        }
123    
124        public void setManagementAgent(ManagementAgent managementAgent) {
125            this.managementAgent = managementAgent;
126        }
127    
128        public void onlyManageProcessorWithCustomId(boolean flag) {
129            onlyManageProcessorWithCustomId = flag;
130        }
131    
132        public boolean isOnlyManageProcessorWithCustomId() {
133            return onlyManageProcessorWithCustomId;
134        }
135    
136        public boolean manageProcessor(ProcessorDefinition<?> definition) {
137            return false;
138        }
139    
140        public void manageObject(Object managedObject) throws Exception {
141            // noop
142        }
143    
144        public void manageNamedObject(Object managedObject, Object preferredName) throws Exception {
145            // noop
146        }
147    
148        public <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception {
149            // noop
150            return null;
151        }
152    
153        public void unmanageObject(Object managedObject) throws Exception {
154            // noop
155        }
156    
157        public void unmanageNamedObject(Object name) throws Exception {
158            // noop
159        }
160    
161        public boolean isManaged(Object managedObject, Object name) {
162            // noop
163            return false;
164        }
165    
166        public CamelContext getCamelContext() {
167            return camelContext;
168        }
169    
170        public void setCamelContext(CamelContext camelContext) {
171            this.camelContext = camelContext;
172        }
173    
174        public void notify(EventObject event) throws Exception {
175            if (eventNotifiers != null && !eventNotifiers.isEmpty()) {
176                for (EventNotifier notifier : eventNotifiers) {
177                    if (notifier.isEnabled(event)) {
178                        notifier.notify(event);
179                    }
180                }
181            }
182        }
183    
184        public Statistic createStatistic(String name, Object owner, Statistic.UpdateMode updateMode) {
185            // noop
186            return null;
187        }
188    
189        public void setStatisticsLevel(ManagementStatisticsLevel level) {
190            this.statisticsLevel = level;
191        }
192    
193        public ManagementStatisticsLevel getStatisticsLevel() {
194            return statisticsLevel;
195        }
196    
197        public boolean isLoadStatisticsEnabled() {
198            return loadStatisticsEnabled;
199        }
200    
201        public void setLoadStatisticsEnabled(boolean loadStatisticsEnabled) {
202            this.loadStatisticsEnabled = loadStatisticsEnabled;
203        }
204    
205        protected void doStart() throws Exception {
206            LOG.info("JMX is disabled");
207            doStartManagementStrategy();
208        }
209    
210        protected void doStartManagementStrategy() throws Exception {
211            ObjectHelper.notNull(camelContext, "CamelContext");
212    
213            if (eventNotifiers != null) {
214                for (EventNotifier notifier : eventNotifiers) {
215    
216                    // inject CamelContext if the service is aware
217                    if (notifier instanceof CamelContextAware) {
218                        CamelContextAware aware = (CamelContextAware) notifier;
219                        aware.setCamelContext(camelContext);
220                    }
221    
222                    ServiceHelper.startService(notifier);
223                }
224            }
225    
226            if (managementAgent != null) {
227                ServiceHelper.startService(managementAgent);
228                // set the naming strategy using the domain name from the agent
229                if (managementNamingStrategy == null) {
230                    setManagementNamingStrategy(new DefaultManagementNamingStrategy(managementAgent.getMBeanObjectDomainName()));
231                }
232            }
233            if (managementNamingStrategy instanceof CamelContextAware) {
234                ((CamelContextAware) managementNamingStrategy).setCamelContext(getCamelContext());
235            }
236        }
237    
238        protected void doStop() throws Exception {
239            ServiceHelper.stopServices(managementAgent, eventNotifiers);
240        }
241    
242    }