001: /*
002:
003: Derby - class org.apache.derby.jdbc.EmbedXAConnection40
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: package org.apache.derby.jdbc;
022:
023: import java.util.Vector;
024: import java.sql.PreparedStatement;
025: import java.sql.SQLException;
026: import javax.sql.StatementEvent;
027: import javax.sql.StatementEventListener;
028: import javax.sql.XAConnection;
029: import org.apache.derby.iapi.jdbc.ResourceAdapter;
030:
031: /**
032: * This class implements jdbc4.0 methods of XAConnection
033: */
034: final class EmbedXAConnection40 extends EmbedXAConnection implements
035: XAConnection {
036:
037: //using generics to avoid casting problems
038: protected final Vector<StatementEventListener> statementEventListeners = new Vector<StatementEventListener>();
039:
040: /**
041: * Creates EmbedXAConnection40.
042: * @param ds
043: * @param ra
044: * @param user
045: * @param password
046: * @param requestPassword
047: */
048: EmbedXAConnection40(EmbeddedDataSource ds, ResourceAdapter ra,
049: String user, String password, boolean requestPassword)
050: throws SQLException {
051: super (ds, ra, 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:
136: }
|