001package org.javasimon.jdbcx4; 002 003import java.sql.Connection; 004import java.sql.SQLException; 005import java.util.HashMap; 006import java.util.Map; 007import javax.sql.*; 008 009import org.javasimon.jdbc4.RegexBasedNormalizerFactory; 010import org.javasimon.jdbc4.SimonConnection; 011import org.javasimon.jdbc4.SqlNormalizerFactory; 012 013/** 014 * Simon implementation of <code>PooledConnection</code>, needed for 015 * Simon ConnectionPollDataSource implementation. 016 * <p> 017 * All method invokes its real implementation. 018 * <p> 019 * See the {@link org.javasimon.jdbcx4 package description} for more 020 * information. 021 * 022 * @author Radovan Sninsky 023 * @author <a href="mailto:virgo47@gmail.com">Richard "Virgo" Richter</a> 024 * @since 2.4 025 */ 026public class SimonPooledConnection implements PooledConnection { 027 028 private class SimonConnectionEventListener implements ConnectionEventListener { 029 030 private final ConnectionEventListener originalListener; 031 032 SimonConnectionEventListener(ConnectionEventListener originalListener) { 033 this.originalListener = originalListener; 034 } 035 036 @Override 037 public void connectionClosed(ConnectionEvent event) { 038 originalListener.connectionClosed(new ConnectionEvent(SimonPooledConnection.this, event.getSQLException())); 039 } 040 041 @Override 042 public void connectionErrorOccurred(ConnectionEvent event) { 043 originalListener.connectionErrorOccurred(new ConnectionEvent(SimonPooledConnection.this, event.getSQLException())); 044 } 045 } 046 047 private class SimonStatementEventListener implements StatementEventListener { 048 049 private final StatementEventListener originalListener; 050 051 SimonStatementEventListener(StatementEventListener originalListener) { 052 this.originalListener = originalListener; 053 } 054 055 @Override 056 public void statementClosed(StatementEvent event) { 057 originalListener.statementClosed(new StatementEvent(SimonPooledConnection.this, event.getStatement())); 058 } 059 060 @Override 061 public void statementErrorOccurred(StatementEvent event) { 062 originalListener.statementErrorOccurred(new StatementEvent(SimonPooledConnection.this, event.getStatement(), event.getSQLException())); 063 } 064 } 065 066 private final PooledConnection pooledConn; 067 private final String prefix; 068 private Map<ConnectionEventListener, SimonConnectionEventListener> connListeners = new HashMap<>(); 069 private Map<StatementEventListener, SimonStatementEventListener> stmtListeners = new HashMap<>(); 070 private SqlNormalizerFactory sqlNormalizerFactory = new RegexBasedNormalizerFactory(); 071 072 /** 073 * Class constructor. 074 * 075 * @param connection real pooled connection 076 * @param prefix Simon prefix 077 */ 078 public SimonPooledConnection(PooledConnection connection, String prefix) { 079 this.pooledConn = connection; 080 this.prefix = prefix; 081 } 082 083 public SimonPooledConnection withSqlNormalizerFactory(SqlNormalizerFactory sqlNormalizerFactory) { 084 this.sqlNormalizerFactory = sqlNormalizerFactory; 085 return this; 086 } 087 088 @Override 089 public final Connection getConnection() throws SQLException { 090 return new SimonConnection(pooledConn.getConnection(), prefix, sqlNormalizerFactory); 091 } 092 093 @Override 094 public final void close() throws SQLException { 095 pooledConn.close(); 096 } 097 098 @Override 099 public final void addConnectionEventListener(ConnectionEventListener listener) { 100 connListeners.put(listener, new SimonConnectionEventListener(listener)); 101 pooledConn.addConnectionEventListener(connListeners.get(listener)); 102 } 103 104 @Override 105 public final void removeConnectionEventListener(ConnectionEventListener listener) { 106 pooledConn.removeConnectionEventListener(connListeners.get(listener)); 107 connListeners.remove(listener); 108 } 109 110 @Override 111 public void addStatementEventListener(StatementEventListener listener) { 112 stmtListeners.put(listener, new SimonStatementEventListener(listener)); 113 pooledConn.addStatementEventListener(stmtListeners.get(listener)); 114 } 115 116 @Override 117 public void removeStatementEventListener(StatementEventListener listener) { 118 pooledConn.removeStatementEventListener(stmtListeners.get(listener)); 119 stmtListeners.remove(listener); 120 } 121}