PersistenceConfig.java

package pk.lucidxpo.ynami.spring;

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 org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import pk.lucidxpo.ynami.spring.features.FeatureProxyFactoryBeanWrapper;
import pk.lucidxpo.ynami.spring.security.SpringSecurityAuditAwareImpl;

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

@Configuration
@EnableJpaAuditing
@EnableTransactionManagement
public class PersistenceConfig {
    static final String AUDITOR_AWARE_BEAN_NAME = "auditorAware";

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public AuditorAware<String> insecureAuditorAware() {
        return new AuditorAwareImpl();
    }

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public AuditorAware<String> springSecurityAuditorAware() {
        return new SpringSecurityAuditAwareImpl();
    }

    @Bean
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true")
    public FeatureProxyFactoryBeanWrapper proxiedAuditorAware() {
        final FeatureProxyFactoryBeanWrapper proxyFactoryBean = new FeatureProxyFactoryBeanWrapper();
        proxyFactoryBean.setFeature(WEB_SECURITY);
        proxyFactoryBean.setProxyType(AuditorAware.class);
        proxyFactoryBean.setActive(springSecurityAuditorAware());
        proxyFactoryBean.setInactive(insecureAuditorAware());
        return proxyFactoryBean;
    }

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

    @Bean(AUDITOR_AWARE_BEAN_NAME)
    @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "false", matchIfMissing = true)
    public AuditorAware auditorAwareWhenTogglzIsDisabled() {
        return new AuditorAwareImpl();
    }
}