package org.apereo.cas.audit.config; import org.apache.commons.lang3.StringUtils; import org.apereo.cas.audit.entity.AuditTrailEntity; import org.apereo.cas.audit.spi.DefaultDelegatingAuditTrailManager; import org.apereo.cas.audit.spi.DelegatingAuditTrailManager; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.configuration.model.core.audit.AuditProperties; import org.apereo.cas.configuration.model.support.jpa.JpaConfigDataHolder; import org.apereo.cas.configuration.support.Beans; import org.apereo.inspektr.audit.support.JdbcAuditTrailManager; import org.apereo.inspektr.audit.support.MaxAgeWhereClauseMatchCriteria; import org.apereo.inspektr.audit.support.WhereClauseMatchCriteria; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.Lazy; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.support.TransactionTemplate; import javax.sql.DataSource; /** * This is {@link CasSupportJdbcAuditConfiguration}. * * @author Misagh Moayyed * @since 5.0.0 */ @Configuration("casJdbcAuditConfiguration") @EnableAspectJAutoProxy @EnableConfigurationProperties(CasConfigurationProperties.class) @EnableTransactionManagement(proxyTargetClass = true) public class CasSupportJdbcAuditConfiguration { @Autowired private CasConfigurationProperties casProperties; @Bean public DelegatingAuditTrailManager auditTrailManager() { final AuditProperties.Jdbc jdbc = casProperties.getAudit().getJdbc(); final JdbcAuditTrailManager t = new JdbcAuditTrailManager(inspektrAuditTransactionTemplate()); t.setCleanupCriteria(auditCleanupCriteria()); t.setDataSource(inspektrAuditTrailDataSource()); String tableName = AuditTrailEntity.AUDIT_TRAIL_TABLE_NAME; if (StringUtils.isNotBlank(jdbc.getDefaultSchema())) { tableName = jdbc.getDefaultSchema() + '.' + tableName; } if (StringUtils.isNotBlank(jdbc.getDefaultCatalog())) { tableName = jdbc.getDefaultCatalog() + '.' + tableName; } t.setTableName(tableName); return new DefaultDelegatingAuditTrailManager(t); } @Lazy @Bean public LocalContainerEntityManagerFactoryBean inspektrAuditEntityManagerFactory() { return Beans.newHibernateEntityManagerFactoryBean( new JpaConfigDataHolder( Beans.newHibernateJpaVendorAdapter(casProperties.getJdbc()), "jpaInspektrAuditContext", new String[]{"org.apereo.cas.audit.entity"}, inspektrAuditTrailDataSource()), casProperties.getAudit().getJdbc()); } @Bean @RefreshScope public WhereClauseMatchCriteria auditCleanupCriteria() { return new MaxAgeWhereClauseMatchCriteria(casProperties.getAudit().getJdbc().getMaxAgeDays()); } @Bean public PlatformTransactionManager inspektrAuditTransactionManager() { return new DataSourceTransactionManager(inspektrAuditTrailDataSource()); } @Bean @RefreshScope public DataSource inspektrAuditTrailDataSource() { return Beans.newDataSource(casProperties.getAudit().getJdbc()); } @Bean public TransactionTemplate inspektrAuditTransactionTemplate() { final TransactionTemplate t = new TransactionTemplate(inspektrAuditTransactionManager()); t.setIsolationLevelName(casProperties.getAudit().getJdbc().getIsolationLevelName()); t.setPropagationBehaviorName(casProperties.getAudit().getJdbc().getPropagationBehaviorName()); return t; } }