Author: markt Date: Thu Aug 4 21:21:20 2011 New Revision: 1154021 URL: http://svn.apache.org/viewvc?rev=1154021&view=rev Log: Generics
Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/datasources/KeyedCPDSConnectionFactory.java Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/datasources/KeyedCPDSConnectionFactory.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/datasources/KeyedCPDSConnectionFactory.java?rev=1154021&r1=1154020&r2=1154021&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/datasources/KeyedCPDSConnectionFactory.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/datasources/KeyedCPDSConnectionFactory.java Thu Aug 4 21:21:20 2011 @@ -21,8 +21,8 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.HashMap; -import java.util.Map; +import java.util.HashSet; +import java.util.Set; import java.util.WeakHashMap; import javax.sql.ConnectionEvent; @@ -41,7 +41,8 @@ import org.apache.commons.pool2.KeyedPoo * @version $Revision$ $Date$ */ class KeyedCPDSConnectionFactory - implements KeyedPoolableObjectFactory, ConnectionEventListener, PooledConnectionManager { + implements KeyedPoolableObjectFactory<UserPassKey,PooledConnectionAndInfo>, + ConnectionEventListener, PooledConnectionManager { private static final String NO_KEY_MESSAGE = "close() was called on a Connection, but " @@ -50,18 +51,20 @@ class KeyedCPDSConnectionFactory private final ConnectionPoolDataSource _cpds; private final String _validationQuery; private final boolean _rollbackAfterValidation; - private KeyedObjectPool _pool; + private KeyedObjectPool<UserPassKey,PooledConnectionAndInfo> _pool; /** * Map of PooledConnections for which close events are ignored. * Connections are muted when they are being validated. */ - private final Map /* <PooledConnection, null> */ validatingMap = new HashMap(); + private final Set<PooledConnection> validatingSet = + new HashSet<PooledConnection>(); /** * Map of PooledConnectionAndInfo instances */ - private final WeakHashMap /* <PooledConnection, PooledConnectionAndInfo> */ pcMap = new WeakHashMap(); + private final WeakHashMap<PooledConnection, PooledConnectionAndInfo> pcMap = + new WeakHashMap<PooledConnection, PooledConnectionAndInfo>(); /** * Create a new <tt>KeyedPoolableConnectionFactory</tt>. @@ -91,7 +94,7 @@ class KeyedCPDSConnectionFactory _rollbackAfterValidation = rollbackAfterValidation; } - public void setPool(KeyedObjectPool pool) { + public void setPool(KeyedObjectPool<UserPassKey,PooledConnectionAndInfo> pool) { this._pool = pool; } @@ -100,7 +103,7 @@ class KeyedCPDSConnectionFactory * * @return KeyedObjectPool managing pooled connections */ - public KeyedObjectPool getPool() { + public KeyedObjectPool<UserPassKey,PooledConnectionAndInfo> getPool() { return _pool; } @@ -112,9 +115,9 @@ class KeyedCPDSConnectionFactory * @see org.apache.commons.pool2.KeyedPoolableObjectFactory#makeObject(java.lang.Object) */ @Override - public synchronized Object makeObject(Object key) throws Exception { - Object obj = null; - UserPassKey upkey = (UserPassKey)key; + public synchronized PooledConnectionAndInfo makeObject(UserPassKey upkey) + throws Exception { + PooledConnectionAndInfo pci = null; PooledConnection pc = null; String username = upkey.getUsername(); @@ -132,101 +135,96 @@ class KeyedCPDSConnectionFactory // should we add this object as a listener or the pool. // consider the validateObject method in decision pc.addConnectionEventListener(this); - obj = new PooledConnectionAndInfo(pc, username, password); - pcMap.put(pc, obj); + pci = new PooledConnectionAndInfo(pc, username, password); + pcMap.put(pc, pci); - return obj; + return pci; } /** * Closes the PooledConnection and stops listening for events from it. */ @Override - public void destroyObject(Object key, Object obj) throws Exception { - if (obj instanceof PooledConnectionAndInfo) { - PooledConnection pc = ((PooledConnectionAndInfo)obj).getPooledConnection(); - pc.removeConnectionEventListener(this); - pcMap.remove(pc); - pc.close(); - } + public void destroyObject(UserPassKey key, PooledConnectionAndInfo pci) + throws Exception { + PooledConnection pc = pci.getPooledConnection(); + pc.removeConnectionEventListener(this); + pcMap.remove(pc); + pc.close(); } /** * Validates a pooled connection. * * @param key ignored - * @param obj {@link PooledConnectionAndInfo} containing the connection to validate + * @param pci {@link PooledConnectionAndInfo} containing the connection to validate * @return true if validation suceeds */ @Override - public boolean validateObject(Object key, Object obj) { + public boolean validateObject(UserPassKey key, + PooledConnectionAndInfo pci) { boolean valid = false; - if (obj instanceof PooledConnectionAndInfo) { - PooledConnection pconn = - ((PooledConnectionAndInfo)obj).getPooledConnection(); - String query = _validationQuery; - if (null != query) { - Connection conn = null; - Statement stmt = null; - ResultSet rset = null; - // logical Connection from the PooledConnection must be closed - // before another one can be requested and closing it will - // generate an event. Keep track so we know not to return - // the PooledConnection - validatingMap.put(pconn, null); - try { - conn = pconn.getConnection(); - stmt = conn.createStatement(); - rset = stmt.executeQuery(query); - if (rset.next()) { - valid = true; - } else { - valid = false; - } - if (_rollbackAfterValidation) { - conn.rollback(); - } - } catch(Exception e) { + PooledConnection pconn = pci.getPooledConnection(); + String query = _validationQuery; + if (null != query) { + Connection conn = null; + Statement stmt = null; + ResultSet rset = null; + // logical Connection from the PooledConnection must be closed + // before another one can be requested and closing it will + // generate an event. Keep track so we know not to return + // the PooledConnection + validatingSet.add(pconn); + try { + conn = pconn.getConnection(); + stmt = conn.createStatement(); + rset = stmt.executeQuery(query); + if (rset.next()) { + valid = true; + } else { valid = false; - } finally { - if (rset != null) { - try { - rset.close(); - } catch (Throwable t) { - // ignore - } + } + if (_rollbackAfterValidation) { + conn.rollback(); + } + } catch(Exception e) { + valid = false; + } finally { + if (rset != null) { + try { + rset.close(); + } catch (Throwable t) { + // ignore } - if (stmt != null) { - try { - stmt.close(); - } catch (Throwable t) { - // ignore - } + } + if (stmt != null) { + try { + stmt.close(); + } catch (Throwable t) { + // ignore } - if (conn != null) { - try { - conn.close(); - } catch (Throwable t) { - // ignore - } + } + if (conn != null) { + try { + conn.close(); + } catch (Throwable t) { + // ignore } - validatingMap.remove(pconn); } - } else { - valid = true; + validatingSet.remove(pconn); } } else { - valid = false; + valid = true; } return valid; } @Override - public void passivateObject(Object key, Object obj) { + public void passivateObject(UserPassKey key, PooledConnectionAndInfo pci) { } @Override - public void activateObject(Object key, Object obj) { + public void activateObject(UserPassKey key, PooledConnectionAndInfo pci) { } // *********************************************************************** @@ -245,23 +243,22 @@ class KeyedCPDSConnectionFactory // if this event occurred because we were validating, or if this // connection has been marked for removal, ignore it // otherwise return the connection to the pool. - if (!validatingMap.containsKey(pc)) { - PooledConnectionAndInfo info = - (PooledConnectionAndInfo) pcMap.get(pc); - if (info == null) { + if (!validatingSet.contains(pc)) { + PooledConnectionAndInfo pci = pcMap.get(pc); + if (pci == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { - _pool.returnObject(info.getUserPassKey(), info); + _pool.returnObject(pci.getUserPassKey(), pci); } catch (Exception e) { System.err.println("CLOSING DOWN CONNECTION AS IT COULD " + "NOT BE RETURNED TO THE POOL"); pc.removeConnectionEventListener(this); try { - _pool.invalidateObject(info.getUserPassKey(), info); + _pool.invalidateObject(pci.getUserPassKey(), pci); } catch (Exception e3) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + - info); + pci); e3.printStackTrace(); } } @@ -282,7 +279,7 @@ class KeyedCPDSConnectionFactory } pc.removeConnectionEventListener(this); - PooledConnectionAndInfo info = (PooledConnectionAndInfo) pcMap.get(pc); + PooledConnectionAndInfo info = pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } @@ -307,7 +304,7 @@ class KeyedCPDSConnectionFactory */ @Override public void invalidate(PooledConnection pc) throws SQLException { - PooledConnectionAndInfo info = (PooledConnectionAndInfo) pcMap.get(pc); + PooledConnectionAndInfo info = pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); }