/* * � Copyright IBM Corp. 2010, 2015 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.ibm.xsp.extlib.relational.jdbc.datasource.dbcp; import java.io.PrintWriter; import java.security.AccessController; import java.security.PrivilegedExceptionAction; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.pool.impl.GenericObjectPool; import com.ibm.commons.jdbc.drivers.JDBCDriverLoader; import com.ibm.commons.util.StringUtil; import com.ibm.designer.runtime.util.pool.PoolException; import com.ibm.xsp.extlib.relational.resources.IJdbcResourceFactory; public class DbcpPoolDataSource implements IJdbcResourceFactory { public static final String TYPE = "JDBC"; // $NON-NLS-1$ private static DataSource ds; private static Driver driver; private GenericObjectPool pool; /** * */ public DbcpPoolDataSource(final String dataSourceName, final String driverClass, final String url, final String username, final String password, final int minIdle, final int maxIdle, final int maxActive, final long maxWait) throws PoolException{ try { ds = AccessController.doPrivileged( new PrivilegedExceptionAction<DataSource>() { public DataSource run() throws Exception { // create a driver connection factory driver = JDBCDriverLoader.loadDriver(driverClass); Properties properties = new Properties(); properties.setProperty("user", username); // $NON-NLS-1$ properties.setProperty("password", (StringUtil.isEmpty(password) ? "":password)); // $NON-NLS-1$ ConnectionFactory connectionFactory = new DriverConnectionFactory(driver, url, properties); // create the pool pool = new GenericObjectPool(); pool.setMaxActive(maxActive); pool.setMaxWait(maxWait); pool.setMaxIdle(maxIdle); pool.setMinIdle(minIdle); // create the pool object factory PoolableConnectionFactory factory = new PoolableConnectionFactory(connectionFactory, pool, null, null, false, true); pool.setFactory(factory); // finally create the datasource PoolingDataSource bds = new PoolingDataSource(pool); return bds; } }); } catch (Exception e) { String msg = "Unable to initialize the shared connection pool DataSource"; // $NLX-DbcpPoolDataSource.Unabletoinitializethesharedconnec-1$[["connection pool" is a technical term related to databases]] // Note, this resource key is used elsewhere in this plugin // "Unable to initialize the shared connection pool DataSource" //String msg = com.ibm.xsp.extlib.relational.ResourceHandler.getSpecialAudienceString("DbcpPoolDataSource.Unabletoinitializethesharedconnec");//$NON-NLS-1$ throw new PoolException( e, msg); } } public void checkTimeout(long arg0) { //TODO add implementation } public String getName() { return null; } public String getType() { return TYPE; } public void recycle() { if(pool != null) { //TODO check if this is the intended behaviour pool.clear(); } } /* (non-Javadoc) * @see javax.sql.DataSource#getConnection() */ public Connection getConnection() throws SQLException { return ds.getConnection(); } /* (non-Javadoc) * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) */ public Connection getConnection(String username, String password) throws SQLException { return ds.getConnection(username, password); } /* (non-Javadoc) * @see javax.sql.CommonDataSource#getLogWriter() */ public PrintWriter getLogWriter() throws SQLException { return ds.getLogWriter(); } /* (non-Javadoc) * @see javax.sql.CommonDataSource#getLoginTimeout() */ public int getLoginTimeout() throws SQLException { return ds.getLoginTimeout(); } /* (non-Javadoc) * @see javax.sql.CommonDataSource#setLogWriter(java.io.PrintWriter) */ public void setLogWriter(PrintWriter out) throws SQLException { ds.setLogWriter(out); } /* (non-Javadoc) * @see javax.sql.CommonDataSource#setLoginTimeout(int) */ public void setLoginTimeout(int seconds) throws SQLException { ds.setLoginTimeout(seconds); } /* (non-Javadoc) * @see java.sql.Wrapper#isWrapperFor(java.lang.Class) */ public boolean isWrapperFor(Class<?> iface) throws SQLException { return isWrapperFor(iface); } /* (non-Javadoc) * @see java.sql.Wrapper#unwrap(java.lang.Class) */ public <T> T unwrap(Class<T> iface) throws SQLException { return unwrap(iface); } }