/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.store.support; import javax.sql.DataSource; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; import com.enonic.cms.framework.jdbc.DecoratedDataSource; import com.enonic.cms.framework.jdbc.DriverFixConnectionDecorator; public final class DataSourceFactory implements FactoryBean<DataSource>, InitializingBean, DisposableBean { private DataSource dataSource; private String jndiName; private EmbeddedDatabase embeddedDatabase; private boolean useEmbedded; public DataSourceFactory() { this.embeddedDatabase = new EmbeddedDatabase(); } public void setJndiName( final String jndiName ) { this.jndiName = jndiName; } public void setUserName( final String userName ) { this.embeddedDatabase.setUserName( userName ); } public void setPassword( final String password ) { this.embeddedDatabase.setPassword( password ); } public void setJdbcUrl( final String jdbcUrl ) { this.embeddedDatabase.setJdbcUrl( jdbcUrl ); } public void setMaxConnections( final int maxConnections ) { this.embeddedDatabase.setMaxConnections( maxConnections ); } public void setUseEmbedded( final boolean useEmbedded ) { this.useEmbedded = useEmbedded; } public void afterPropertiesSet() { final DataSource original = createDataSource(); this.dataSource = new DecoratedDataSource( original, new DriverFixConnectionDecorator() ); } private DataSource createDataSource() { if ( this.useEmbedded ) { return createEmbeddedDatabase(); } else { return lookupUsingJndi(); } } private DataSource lookupUsingJndi() { final JndiDataSourceLookup lookup = new JndiDataSourceLookup(); return lookup.getDataSource( this.jndiName ); } private DataSource createEmbeddedDatabase() { this.embeddedDatabase.initialize(); return this.embeddedDatabase.getDataSource(); } public DataSource getObject() { return this.dataSource; } public Class getObjectType() { return DataSource.class; } public boolean isSingleton() { return true; } @Override public void destroy() { this.embeddedDatabase.dispose(); } }