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 }