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}