1 package pk.lucidxpo.ynami.spring; 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 org.springframework.data.domain.AuditorAware; 10 import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 11 import org.springframework.transaction.annotation.EnableTransactionManagement; 12 import pk.lucidxpo.ynami.spring.features.FeatureProxyFactoryBeanWrapper; 13 import pk.lucidxpo.ynami.spring.security.SpringSecurityAuditAwareImpl; 14 15 import static pk.lucidxpo.ynami.spring.features.FeatureToggles.WEB_SECURITY; 16 17 @Configuration 18 @EnableJpaAuditing 19 @EnableTransactionManagement 20 public class PersistenceConfig { 21 static final String AUDITOR_AWARE_BEAN_NAME = "auditorAware"; 22 23 @Bean 24 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 25 public AuditorAware<String> insecureAuditorAware() { 26 return new AuditorAwareImpl(); 27 } 28 29 @Bean 30 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 31 public AuditorAware<String> springSecurityAuditorAware() { 32 return new SpringSecurityAuditAwareImpl(); 33 } 34 35 @Bean 36 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 37 public FeatureProxyFactoryBeanWrapper proxiedAuditorAware() { 38 final FeatureProxyFactoryBeanWrapper proxyFactoryBean = new FeatureProxyFactoryBeanWrapper(); 39 proxyFactoryBean.setFeature(WEB_SECURITY); 40 proxyFactoryBean.setProxyType(AuditorAware.class); 41 proxyFactoryBean.setActive(springSecurityAuditorAware()); 42 proxyFactoryBean.setInactive(insecureAuditorAware()); 43 return proxyFactoryBean; 44 } 45 46 @Primary 47 @Bean(AUDITOR_AWARE_BEAN_NAME) 48 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "true") 49 public AuditorAware auditorAware(@Autowired @Qualifier("proxiedAuditorAware") final FeatureProxyFactoryBeanWrapper proxiedAuditorAware) throws Exception { 50 return (AuditorAware) proxiedAuditorAware.getObject(); 51 } 52 53 @Bean(AUDITOR_AWARE_BEAN_NAME) 54 @ConditionalOnProperty(name = "config.togglz.enabled", havingValue = "false", matchIfMissing = true) 55 public AuditorAware auditorAwareWhenTogglzIsDisabled() { 56 return new AuditorAwareImpl(); 57 } 58 }