/**
 * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
 * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 */
package org.ralasafe.db;

import java.util.Properties;

import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;

/**
 * <code>DataSource</code> dbcp's implement.
 * 
 * @author back
 *
 */
public class DataSourceProviderDbcpImpl extends DataSource {
	private javax.sql.DataSource ds = null;
	private String name;
	private Properties prop;
	
	public String getName() {
		return name;
	}

	public void setName( String name ) {
		this.name=name;
	}

	public void setup( Properties prop ) {
		this.prop=prop;

        GenericObjectPool.Config conPoolCfg = new GenericObjectPool.Config();
        conPoolCfg.maxActive = Integer.parseInt( prop.getProperty( "connectionPoolMaxSize", "15" ) );
        conPoolCfg.maxIdle = Integer.parseInt( prop.getProperty( "connectionPoolMaxIdle", "8" ) );
        conPoolCfg.maxWait = Integer.parseInt( prop.getProperty( "connectionPoolMaxWait", "60000" ) );
        conPoolCfg.minIdle = Integer.parseInt( prop.getProperty( "connectionPoolMinSize", "2" ) );


        ObjectPool connectionPool = new GenericObjectPool( null, conPoolCfg );
        try {
			Class.forName( prop.getProperty( "jdbcDriver" ) );
		} catch( ClassNotFoundException e ) {
			e.printStackTrace();
			throw new RuntimeException();
		}

        ConnectionFactory connectionFactory = new
            DriverManagerConnectionFactory( prop.getProperty( "jdbcUrl" ),
                                           prop.getProperty( "jdbcUser" ), 
                                           prop.getProperty( "jdbcPassword" ) );


        new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);

        PoolingDataSource dataSource = new PoolingDataSource(connectionPool);
        
        ds = dataSource;
	}

	public javax.sql.DataSource getDataSource() {
		return ds;
	}
	
	public String getValidInfo( Properties prop ) {
		this.prop=prop;
		if( prop.containsKey( "jdbcUrl" ) 
				&& prop.containsKey( "jdbcUser" )
				&& prop.containsKey( "jdbcPassword" )
				&& prop.containsKey( "jdbcDriver" ) ) {
			return null;
		}
		
		return "Required properties: jdbcUrl,jdbcUser,jdbcPassword,jdbcDriver";
	}
	public String toString() {
		String line=System.getProperty( "line.separator" );
		StringBuffer buff=new StringBuffer();
		buff.append( "PoweredBy DBCP [ jdbcDriver:" ).append( prop.getProperty( "jdbcDriver" ) ).append( line );
		buff.append( "               \tjdbcUrl:" ).append( prop.getProperty( "jdbcUrl" ) ).append( line );
		buff.append( "               \tjdbcUser:" ).append( prop.getProperty( "jdbcUser" ) ).append( "]" );
		
		return buff.toString();
	}
}