001package org.javasimon.spring;
002
003import org.javasimon.Manager;
004import org.javasimon.SimonManager;
005import org.javasimon.SwitchingManager;
006import org.javasimon.callback.Callback;
007
008import org.springframework.beans.factory.FactoryBean;
009
010import java.util.ArrayList;
011import java.util.List;
012
013/**
014 * Factory bean which produces Simon manager.
015 * Spring configuration:
016 * <pre>{@code
017 * <bean id="jmxServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
018 *     <property name="locateExistingServerIfPossible" value="true"/>
019 * </bean>
020 * <bean id="simonManager" class="org.javasimon.spring.ManagerFactoryBean">
021 *     <property name="callbacks">
022 *         <list>
023 *             <bean class="org.javasimon.jmx.JmxRegisterCallback">
024 *                 <constructor-arg ref="jmxServer"/>
025 *                 <constructor-arg value="org.javasimon"/>
026 *             </bean>
027 *             <bean class="org.javasimon.utils.LoggingCallback"/>
028 *         </list>
029 *     </property>
030 * </bean>
031 * <bean id="simonInterceptor" class="org.javasimon.spring.MonitoringInterceptor">
032 *     <property name="manager" ref="simonManager"/>
033 * </bean>}
034 * </pre>
035 *
036 * @author gquintana
037 */
038public class ManagerFactoryBean implements FactoryBean<Manager> {
039
040        /** Flag indicating whether Simon manager singleton should be used. Defaults to true. */
041        private boolean singleton = true;
042
043        /** List of callbacks to add to the manager */
044        private List<Callback> callbacks = new ArrayList<>();
045
046        /** Flag indicated whether Simon manager should enabled or not. Defaults to true. */
047        private boolean enabled = true;
048
049        /**
050         * Get simon manager instance.
051         * If singleton is enabled SimonManager.manager() is invoked else new
052         * Manager is created.
053         * Then callbacks are appended to this manager
054         *
055         * @return Simon manager
056         */
057        public Manager getObject() throws Exception {
058                Manager manager;
059                if (singleton) {
060                        manager = SimonManager.manager();
061                } else {
062                        manager = new SwitchingManager();
063                }
064                registerCallbacks(manager);
065                configureEnabled(manager);
066                return manager;
067        }
068
069        /**
070         * @return Always Manager class
071         */
072        public Class<Manager> getObjectType() {
073                return Manager.class;
074        }
075
076        public boolean isSingleton() {
077                return singleton;
078        }
079
080        public void setSingleton(boolean singleton) {
081                this.singleton = singleton;
082        }
083
084        /**
085         * Register callbacks in given manager
086         *
087         * @param manager Manager
088         */
089        private void registerCallbacks(Manager manager) {
090                if (callbacks != null) {
091                        for (Callback callback : callbacks) {
092                                manager.callback().addCallback(callback);
093                        }
094                }
095        }
096
097        public List<Callback> getCallbacks() {
098                return callbacks;
099        }
100
101        public void setCallbacks(List<Callback> callbacks) {
102                this.callbacks = callbacks;
103        }
104
105        /**
106         * When needed toggle the enabled flag of given Simon manager
107         *
108         * @param manager Simon manager
109         */
110        private void configureEnabled(Manager manager) {
111                if (enabled != manager.isEnabled()) {
112                        if (enabled) {
113                                manager.enable();
114                        } else {
115                                manager.disable();
116                        }
117                }
118        }
119
120        public boolean isEnabled() {
121                return enabled;
122        }
123
124        public void setEnabled(boolean enabled) {
125                this.enabled = enabled;
126        }
127}