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}