View Javadoc
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  }