001: /*
002:
003: Derby - Class org.apache.derby.jdbc.EmbedPooledConnection40
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.jdbc;
023:
024: import java.sql.Connection;
025: import java.sql.SQLException;
026: import java.util.Enumeration;
027: import java.util.Vector;
028: import java.sql.PreparedStatement;
029: import javax.sql.StatementEvent;
030: import javax.sql.StatementEventListener;
031:
032: /**
033: A PooledConnection object is a connection object that provides hooks for
034: connection pool management.
035:
036: <P>This is Derby's implementation of a PooledConnection for use in
037: the following environments:
038: <UL>
039: <LI> JDBC 4.0 - J2SE 6.0
040: </UL>
041:
042: */
043: class EmbedPooledConnection40 extends EmbedPooledConnection {
044:
045: //using generics to avoid casting problems
046: protected final Vector<StatementEventListener> statementEventListeners = new Vector<StatementEventListener>();
047:
048: EmbedPooledConnection40(ReferenceableDataSource ds, String user,
049: String password, boolean requestPassword)
050: throws SQLException {
051: super (ds, user, password, requestPassword);
052: }
053:
054: /**
055: * Removes the specified <code>StatementEventListener</code> from the list of
056: * components that will be notified when the driver detects that a
057: * <code>PreparedStatement</code> has been closed or is invalid.
058: * <p>
059: *
060: * @param listener the component which implements the
061: * <code>StatementEventListener</code> interface that was previously
062: * registered with this <code>PooledConnection</code> object
063: * <p>
064: * @since 1.6
065: */
066: public void removeStatementEventListener(
067: StatementEventListener listener) {
068: if (listener == null)
069: return;
070: statementEventListeners.removeElement(listener);
071: }
072:
073: /**
074: * Registers a <code>StatementEventListener</code> with this
075: * <code>PooledConnection</code> object. Components that
076: * wish to be notified when <code>PreparedStatement</code>s created by the
077: * connection are closed or are detected to be invalid may use this method
078: * to register a <code>StatementEventListener</code> with this
079: * <code>PooledConnection</code> object.
080: * <p>
081: *
082: * @param listener an component which implements the
083: * <code>StatementEventListener</code> interface that is to be registered
084: * with this <code>PooledConnection</code> object
085: * <p>
086: * @since 1.6
087: */
088: public void addStatementEventListener(
089: StatementEventListener listener) {
090: if (!isActive)
091: return;
092: if (listener == null)
093: return;
094: statementEventListeners.addElement(listener);
095: }
096:
097: /**
098: * Raise the statementClosed event for all the listeners when the
099: * corresponding events occurs
100: * @param statement PreparedStatement
101: */
102: public void onStatementClose(PreparedStatement statement) {
103: if (!statementEventListeners.isEmpty()) {
104: StatementEvent event = new StatementEvent(this , statement);
105: //synchronized block on statementEventListeners to make it thread
106: //safe
107: synchronized (statementEventListeners) {
108: for (StatementEventListener l : statementEventListeners) {
109: l.statementClosed(event);
110: }
111: }
112: }
113: }
114:
115: /**
116: * Raise the statementErrorOccurred event for all the listeners when the
117: * corresponding events occurs
118: * @param statement PreparedStatement
119: * @param sqle SQLException
120: */
121: public void onStatementErrorOccurred(PreparedStatement statement,
122: SQLException sqle) {
123: if (!statementEventListeners.isEmpty()) {
124: StatementEvent event = new StatementEvent(this , statement,
125: sqle);
126: //synchronized block on statementEventListeners to make it thread
127: //safe
128: synchronized (statementEventListeners) {
129: for (StatementEventListener l : statementEventListeners) {
130: l.statementErrorOccurred(event);
131: }
132: }
133: }
134: }
135: }
|