/* * Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The * University of Hong Kong (HKU). All Rights Reserved. * * This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1] * * [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ package hk.hku.cecid.piazza.commons.dao.ds; import hk.hku.cecid.piazza.commons.dao.DAOException; import hk.hku.cecid.piazza.commons.util.StringUtilities; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; import javax.sql.DataSource; import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS; import org.apache.commons.dbcp.datasources.SharedPoolDataSource; /** * SimpleDSDAOFactory is a subclass of DataSourceDAOFactory and provides an * implementation for accessing the data source by a simple DataSource object * which is backed by the DriverManager and provides no pooling. * <p> * Notice that the DAO created by the createDAO() method shall be an instance of * DataSourceDAO since this factory is a DataSourceDAOFactory. * * @author Hugo Y. K. Lam * */ public class SimpleDSDAOFactory extends DataSourceDAOFactory { /** * Creates a new instance of SimpleDSDAOFactory. */ public SimpleDSDAOFactory() { super(); } /** * Initializes this DAOFactory. */ public void initFactory() throws DAOException { try { String driver = null; String url = null; String username = null; String password = null; boolean isPooling = true; int maxIdle = 0; int maxActive = 10; int maxWait = 50; boolean testOnBorrow = false; boolean testOnReturn = false; boolean testWhileIdle = false; String validationQuery = null; try { driver = getParameter("driver"); url = getParameter("url"); username = getParameter("username", null); password = getParameter("password", null); maxIdle = StringUtilities.parseInt(getParameter("maxIdle", null), 0); maxActive = StringUtilities.parseInt(getParameter("maxActive", null), 0); maxWait = StringUtilities.parseInt(getParameter("maxWait", null), -1); validationQuery = StringUtilities.trim(getParameter("validationQuery", null)); if (validationQuery != null) { testOnBorrow = StringUtilities.parseBoolean(getParameter("testOnBorrow", "false")); testOnReturn = StringUtilities.parseBoolean(getParameter("testOnReturn", "false")); testWhileIdle = StringUtilities.parseBoolean(getParameter("testWhileIdle", "false")); } } catch (Exception e) { throw new DAOException("Invalid parameter for SimpleDSDAOFactory."); } if (getParameter("pooling", null) != null) { if (!getParameter("pooling").equalsIgnoreCase("true") && !getParameter("pooling").equalsIgnoreCase("false")) { throw new DAOException("Invalid parameter for SimpleDSDAOFactory."); } isPooling = StringUtilities.parseBoolean(getParameter("pooling", "true")); } DataSource datasource; if (isPooling) { DriverAdapterCPDS cpds = new DriverAdapterCPDS(); cpds.setDriver(driver); cpds.setUrl(url); cpds.setUser(username); cpds.setPassword(password); SharedPoolDataSource sds = new SharedPoolDataSource(); sds.setConnectionPoolDataSource(cpds); sds.setMaxIdle(maxIdle); sds.setMaxActive(maxActive); sds.setMaxWait(maxWait); sds.setTestOnBorrow(testOnBorrow); sds.setTestOnReturn(testOnReturn); sds.setTestWhileIdle(testWhileIdle); sds.setValidationQuery(validationQuery); datasource = sds; } else { datasource = new SimpleDataSource(driver, url, username, password); } setDataSource(datasource); } catch (Exception e) { throw new DAOException("Cannot initialize SimpleDSDAOFactory!", e); } } /** * SimpleDataSource is an implementation of DataSource and is backed by the * DriverManager. It provides no pooling mechcanism. Moreover, the timeout * and log writer features are shared among all its instances rather than * each has its own. * * @author Hugo Y. K. Lam * */ private class SimpleDataSource implements DataSource { private String url, username, password; /** * Creates a new instance of SimpleDataSource. * * @param driver the jdbc driver. * @param url the url for connecting to the data source. * @throws ClassNotFoundException if the driver class was not found. * @throws SQLException if the url is invalid or a database access error * occurs. */ public SimpleDataSource(String driver, String url) throws ClassNotFoundException, SQLException { this(driver, url, null, null); } /** * Creates a new instance of SimpleDataSource. * * @param driver the jdbc driver. * @param url the url for connecting to the data source. * @param username the username used in connection. * @param password the password used in connection. * @throws ClassNotFoundException if the driver class was not found. * @throws SQLException if the url is invalid or a database access error * occurs. */ public SimpleDataSource(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException { Class.forName(driver); DriverManager.getDriver(url); this.url = url; this.username = username; this.password = password; } public Logger getParentLogger() throws SQLFeatureNotSupportedException { return Logger.getLogger(getClass().getName()); } /** * @see javax.sql.DataSource#getLoginTimeout() */ public int getLoginTimeout() throws SQLException { return DriverManager.getLoginTimeout(); } /** * @see javax.sql.DataSource#setLoginTimeout(int) */ public void setLoginTimeout(int seconds) throws SQLException { DriverManager.setLoginTimeout(seconds); } /** * @see javax.sql.DataSource#getLogWriter() */ public PrintWriter getLogWriter() throws SQLException { return DriverManager.getLogWriter(); } /** * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) */ public void setLogWriter(PrintWriter out) throws SQLException { DriverManager.setLogWriter(out); } /** * @see javax.sql.DataSource#getConnection() */ public Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } /** * @see javax.sql.DataSource#getConnection(java.lang.String, * java.lang.String) */ public Connection getConnection(String username, String password) throws SQLException { return DriverManager.getConnection(url, username, password); } /** * This is required since JDK 1.6. The wrapper is <b>NOT</b> implemented. * SQLException will be thrown when calling. * * @see java.sql.Wrapper#isWrapperFor(Class<?> iface) * @since JDK 1.6 */ public boolean isWrapperFor(Class<?> iface) throws SQLException { throw new SQLException("JDBC wrapper for: " + iface + " is not implemented."); } /** * This is required since JDK 1.6. The wrapper is <b>NOT</b> implemented. * SQLException will be thrown when calling. * * @see java.sql.Wrapper#unwrap(Class<T> iface) * @since JDK 1.6 */ public <T> T unwrap(Class<T> iface) throws SQLException { throw new SQLException("JDBC wrapper for: " + iface + " is not implemented."); } } }