1 package pk.lucidxpo.ynami.spring.sample; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.beans.factory.annotation.Qualifier; 5 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 6 import org.springframework.context.annotation.Bean; 7 import org.springframework.context.annotation.Configuration; 8 import org.springframework.context.annotation.Primary; 9 import pk.lucidxpo.ynami.service.sample.NewToggleableServiceImpl; 10 import pk.lucidxpo.ynami.service.sample.OldToggleableServiceImpl; 11 import pk.lucidxpo.ynami.service.sample.ToggleableService; 12 import pk.lucidxpo.ynami.spring.features.FeatureProxyFactoryBeanWrapper; 13 14 import static pk.lucidxpo.ynami.spring.features.FeatureToggles.TOGGLEABLE_SERVICE; 15 16 @Configuration 17 public class ToggleableServiceConfiguration { 18 19 @Bean 20 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 21 public ToggleableService oldToggleableService() { 22 return new OldToggleableServiceImpl(); 23 } 24 25 @Bean 26 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 27 public ToggleableService newToggleableService() { 28 return new NewToggleableServiceImpl(); 29 } 30 31 @Bean 32 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 33 public FeatureProxyFactoryBeanWrapper proxiedToggleableService() { 34 final FeatureProxyFactoryBeanWrapper proxyFactoryBean = new FeatureProxyFactoryBeanWrapper(); 35 proxyFactoryBean.setFeature(TOGGLEABLE_SERVICE); 36 proxyFactoryBean.setProxyType(ToggleableService.class); 37 proxyFactoryBean.setActive(newToggleableService()); 38 proxyFactoryBean.setInactive(oldToggleableService()); 39 return proxyFactoryBean; 40 } 41 42 @Bean 43 @Primary 44 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 45 public ToggleableService toggleableService( 46 @Autowired @Qualifier("proxiedToggleableService") final FeatureProxyFactoryBeanWrapper proxiedToggleableService 47 ) throws Exception { 48 return (ToggleableService) proxiedToggleableService.getObject(); 49 } 50 51 @Bean 52 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "false", matchIfMissing = true) 53 public ToggleableService oldService() { 54 return new OldToggleableServiceImpl(); 55 } 56 }