DataConfig.java

package org.xandercat.pmdb.config;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jndi.JndiObjectFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.xandercat.pmdb.dao.KeyGenerator;
import org.xandercat.pmdb.dao.RandomKeyGenerator;

/**
 * Data configuration for generic data and RDBMS services.
 *  
 * @author Scott Arnold
 */
@Configuration
@EnableTransactionManagement
public class DataConfig {

	private static final Logger LOGGER = LogManager.getLogger(DataConfig.class);
	
	/**
	 * Bean to provide application the JNDI linkage for a data source.
	 * 
	 * @param dataSourceJndiName JNDI name for datasource
	 * 
	 * @return JNDI object factory bean for datasource
	 */
	@Bean
	public JndiObjectFactoryBean dataSource(@Value("${datasource.jndi.name}") String dataSourceJndiName) {
		LOGGER.info("Getting DataSource as JNDI resource with JNDI name: " + dataSourceJndiName);
		JndiObjectFactoryBean jndiBean = new JndiObjectFactoryBean();
		jndiBean.setJndiName(dataSourceJndiName);
		jndiBean.setProxyInterface(DataSource.class);
		return jndiBean;
	}
	
	/**
	 * JDBC template for queries against the datasource.
	 * 
	 * @param dataSource datasource for application
	 * 
	 * @return JDBC template for datasource
	 */
	@Bean
	public JdbcTemplate jdbcTemplate(DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}
	
	/**
	 * Bean for datasource transaction management.
	 * 
	 * @param dataSource datasource for transaction management
	 * 
	 * @return transaction manager for datasource
	 */
	@Bean
	public PlatformTransactionManager platformTransactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
  
	/**
	 * Bean for generating keys for use with both local and cloud datasources.
	 * 
	 * @return bean for generating key values
	 */
	@Bean
	public KeyGenerator keyGenerator() {
		return new RandomKeyGenerator();
	}
}