/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.jdbc.datasource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.geotools.data.DataSourceException;
import org.geotools.data.DataAccessFactory.Param;
/**
* A datasource factory using DBCP connection pool
*
* @author Andrea Aime - TOPP
*
*
* @source $URL$
*/
public class DBCPDataSourceFactory extends AbstractDataSourceFactorySpi {
public static final Param DSTYPE = new Param("dstype", String.class,
"Must be DBCP", false);
public static final Param USERNAME = new Param("username", String.class,
"User name to login as", false);
public static final Param PASSWORD = new Param("password", String.class,
"Password used to login", false);
public static final Param JDBC_URL = new Param("jdbcUrl", String.class,
"The JDBC url (check the JDCB driver docs to find out its format)", true);
public static final Param DRIVERCLASS = new Param("driverClassName", String.class,
"The JDBC driver class name (check the JDCB driver docs to find out its name)", true);
public static final Param MAXACTIVE = new Param("maxActive", Integer.class,
"The maximum number of active connections in the pool", true);
public static final Param MAXIDLE = new Param("maxIdle", Integer.class,
"The maximum number of idle connections in the pool", true);
private static final Param[] PARAMS = new Param[] { DSTYPE, DRIVERCLASS, JDBC_URL, USERNAME, PASSWORD,
MAXACTIVE, MAXIDLE };
public DataSource createDataSource(Map params) throws IOException {
return createNewDataSource(params);
}
public boolean canProcess(Map params) {
return super.canProcess(params) && "DBCP".equals(params.get("dstype"));
}
public DataSource createNewDataSource(Map params) throws IOException {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName((String) DRIVERCLASS.lookUp(params));
dataSource.setUrl((String) JDBC_URL.lookUp(params));
dataSource.setUsername((String) USERNAME.lookUp(params));
dataSource.setPassword((String) PASSWORD.lookUp(params));
dataSource.setAccessToUnderlyingConnectionAllowed(true);
dataSource.setMaxActive(((Integer) MAXACTIVE.lookUp(params)).intValue());
dataSource.setMaxIdle(((Integer) MAXIDLE.lookUp(params)).intValue());
// check the data source is properly setup by trying to gather a connection out of it
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
throw new DataSourceException("Connection pool improperly set up: " + e.getMessage(), e);
} finally {
// close the connection at once
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
}
}
return dataSource;
}
public String getDescription() {
return "A BDCP connection pool.";
}
public Param[] getParametersInfo() {
return PARAMS;
}
public boolean isAvailable() {
try {
new BasicDataSource();
} catch (Exception e) {
return false;
}
return true;
}
}