/*
* 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.mysql;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
import javax.sql.DataSource;
import org.geotools.data.jdbc.ConnectionPool;
import org.geotools.data.jdbc.ConnectionPoolManager;
import org.geotools.data.jdbc.datasource.DataSourceFinder;
import org.geotools.data.jdbc.datasource.DataSourceUtil;
/**
* Creates ConnectionPool objects for a certain MySQL database instance.
* @author Gary Sheppard garysheppard@psu.edu
* @source $URL$
* @deprecated Use {@link DataSource}, {@link DataSourceUtil} and {@link DataSourceFinder} instead
*/
public class MySQLConnectionFactory {
/** Standard logging instance */
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.data.mysql");
/** Creates Mysql-specific JDBC driver class. */
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String MYSQL_URL_PREFIX = "jdbc:mysql://";
private static Map _dataSources = new HashMap();
private String _dbURL;
private String _username = "";
private String _password = "";
/**
* Creates a new MySQLConnectionFactory object from a MySQL database URL. This
* is normally of the following format:<br/>
* <br/>
* jdbc:mysql://<host>:<port>/<instance>
* @param url the MySQL database URL
*/
public MySQLConnectionFactory(String url) {
_dbURL = url;
}
/**
* Creates a new MySQLConnectionFactory object from a host name, port number,
* and instance name.
* @param host the MySQL database host
* @param port the port number for the MySQL database
* @param instance the MySQL database instance name
*/
public MySQLConnectionFactory(String host, int port, String instance) {
this(MYSQL_URL_PREFIX + host + ":" + String.valueOf(port) + "/" + instance);
}
/**
* Creates a new MySQLConnectionFactory object from a host name and an instance
* name, using the normal MySQL port number of 3306.
* @param host the MySQL database host
* @param instance the MySQL database instance name
*/
public MySQLConnectionFactory(String host, String instance) {
this(host, 3306, instance);
}
/**
* Creates and returns a MySQL ConnectionPool, or gets an existing ConnectionPool
* if one exists, based upon the username and password parameters passed to this
* method. This is shorthand for the following two calls:<br>
* <br>
* connPool.setLogin(username, password);<br>
* connPool.getConnectionPool();<br>
* @param username the MySQL username
* @param password the password corresponding to <code>username</code>
* @return a MySQL ConnectionPool object
* @throws SQLException if an error occurs connecting to the MySQL database
*/
public ConnectionPool getConnectionPool(String username, String password)
throws SQLException {
setLogin(username, password);
return getConnectionPool();
}
/**
* Creates a database connection method to initialize a given database for
* feature extraction with the user and password params.
*
* @param user the name of the user connect to connect to the pgsql db.
* @param password the password for the user.
*
* @return the sql Connection object to the database.
*
* @throws SQLException if the postgis sql driver could not be found
*/
public Connection getConnection(String user, String password)
throws SQLException {
Properties props = new Properties();
props.put("user", user);
props.put("password", password);
return getConnection(props);
}
/**
* Creates a database connection method to initialize a given database for
* feature extraction with the given Properties.
*
* @param props Should contain at a minimum the user and password.
* Additional properties, such as charSet, can also be added.
*
* @return the sql Connection object to the database.
*
* @throws SQLException if the postgis sql driver could not be found
*/
public Connection getConnection(Properties props) throws SQLException {
// makes a new feature type bean to deal with incoming
Connection dbConnection = null;
// Instantiate the driver classes
try {
Class.forName(DRIVER_CLASS);
LOGGER.finest("getting connection at " + _dbURL + "with props: " + props);
dbConnection = DriverManager.getConnection(_dbURL, props);
} catch (ClassNotFoundException cnfe) {
throw new SQLException("Postgis driver was not found.");
}
return dbConnection;
}
/**
* Creates and returns a MySQL ConnectionPool, or gets an existing ConnectionPool
* if one exists, based upon the username and password set in this MySQLConnectionFactory
* object. Please call setLogin before calling this method, or use getConnectionPool(String, String)
* instead.
* @return a MySQL ConnectionPool object
* @throws SQLException if an error occurs connecting to the DB
*/
public ConnectionPool getConnectionPool() throws SQLException {
String poolKey = _dbURL + _username + _password;
MysqlConnectionPoolDataSource poolDataSource = (MysqlConnectionPoolDataSource) _dataSources
.get(poolKey);
if (poolDataSource == null) {
poolDataSource = new MysqlConnectionPoolDataSource();
poolDataSource.setURL(_dbURL);
poolDataSource.setUser(_username);
poolDataSource.setPassword(_password);
_dataSources.put(poolKey, poolDataSource);
}
ConnectionPoolManager manager = ConnectionPoolManager.getInstance();
ConnectionPool connectionPool = manager.getConnectionPool(poolDataSource);
return connectionPool;
}
/**
* Sets the MySQL database login credentials.
* @param username the username
* @param password the password
*/
public void setLogin(String username, String password) {
_username = username;
_password = password;
}
public void free(ConnectionPool connectionPool) {
if (!connectionPool.isClosed()) {
connectionPool.close();
}
ConnectionPoolManager.getInstance().free(connectionPool);
}
}