/* * 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.geometryless; 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 org.geotools.data.jdbc.ConnectionPool; import org.geotools.data.jdbc.ConnectionPoolManager; /** * Creates ConnectionPool objects for a certain JDBC database instance. * @author Rob Atkinson rob@socialchange.net.NOSPAM.au * @author Gary Sheppard garysheppard@psu.edu * @source $URL$ */ public class JDBCConnectionFactory { /** Standard logging instance */ private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.data.geometryless"); /** Creates configuration-driven JDBC driver class. */ private String _driver = ""; private static Map _dataSources = new HashMap(); private String _dbURL; private String _username = ""; private String _password = ""; /** An alternate character set to use. */ private String charSet; /** * Creates a new JDBCConnectionFactory object from a specified database URL. This is the only constructor supported since there is significant variability in implementation syntax <br/> * <br/> * jdbc:mysql://<host>:<port>/<instance> * @param url the JDBC database URL */ public JDBCConnectionFactory(String url, String driver) { _driver = driver; _dbURL = url; } /** * Creates and returns a JDBC 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 JDBC username * @param password the password corresponding to <code>username</code> * @return a JDBC ConnectionPool object * @throws SQLException if an error occurs connecting to the JDBC 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 db. * @param password the password for the user. * * @return the sql Connection object to the database. * * @throws SQLException if the configured 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); if (charSet != null) { props.put("charSet", charSet); } 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; // dbConnection = getConnectionPool().getConnection(); // Instantiate the driver classes try { Class.forName("com.mysql.jdbc.Driver"); LOGGER.fine("getting connection at " + _dbURL + " using " + _driver + " with props: " + props); dbConnection = DriverManager.getConnection(_dbURL, props); } catch (ClassNotFoundException cnfe) { throw new SQLException("JDBC driver ("+ _driver + " was not found."); } return dbConnection; } /** * Creates and returns a ConnectionPool, or gets an existing ConnectionPool * if one exists, based upon the username and password set in this JDBCConnectionFactory * object. Please call setLogin before calling this method, or use getConnectionPool(String, String) * instead. * @return a ConnectionPool object * @throws SQLException if an error occurs connecting to the DB */ public ConnectionPool getConnectionPool() throws SQLException { String poolKey = _dbURL + _username + _password; ConnectionPoolFacade poolDataSource = (ConnectionPoolFacade) _dataSources.get(poolKey); if (poolDataSource == null) { poolDataSource = new ConnectionPoolFacade( poolKey , _driver ); 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 JDBC 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); } /** * Sets a different character set for the postgis driver to use. * * @param charSet the string of a valid charset name. */ public void setCharSet(String charSet) { this.charSet = charSet; } }