ToggleableServiceConfiguration.java

package pk.lucidxpo.ynami.spring.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import pk.lucidxpo.ynami.service.sample.NewToggleableServiceImpl;
import pk.lucidxpo.ynami.service.sample.OldToggleableServiceImpl;
import pk.lucidxpo.ynami.service.sample.ToggleableService;
import pk.lucidxpo.ynami.spring.features.FeatureProxyFactoryBeanWrapper;

import static pk.lucidxpo.ynami.spring.features.FeatureToggles.TOGGLEABLE_SERVICE;

@Configuration
public class ToggleableServiceConfiguration {

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public ToggleableService oldToggleableService() {
        return new OldToggleableServiceImpl();
    }

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public ToggleableService newToggleableService() {
        return new NewToggleableServiceImpl();
    }

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public FeatureProxyFactoryBeanWrapper proxiedToggleableService() {
        final FeatureProxyFactoryBeanWrapper proxyFactoryBean = new FeatureProxyFactoryBeanWrapper();
        proxyFactoryBean.setFeature(TOGGLEABLE_SERVICE);
        proxyFactoryBean.setProxyType(ToggleableService.class);
        proxyFactoryBean.setActive(newToggleableService());
        proxyFactoryBean.setInactive(oldToggleableService());
        return proxyFactoryBean;
    }

    @Bean
    @Primary
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public ToggleableService toggleableService(
            @Autowired @Qualifier("proxiedToggleableService") final FeatureProxyFactoryBeanWrapper proxiedToggleableService
    ) throws Exception {
        return (ToggleableService) proxiedToggleableService.getObject();
    }

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "false", matchIfMissing = true)
    public ToggleableService oldService() {
        return new OldToggleableServiceImpl();
    }
}