blob: a68a0c69e52a5c44deeaa2b7c14a788f7784cbad [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.lib.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager;
/**
* Manages the firing of {@link JDBCEvent}s.
*
* @author Abe White
*/
public class JDBCEventConnectionDecorator extends AbstractConcurrentEventManager
implements ConnectionDecorator {
private static final long serialVersionUID = 1L;
@Override
public Connection decorate(Connection conn) {
if (!hasListeners())
return conn;
return new EventConnection(conn);
}
/**
* Fire the given event to all listeners. Prevents creation of an
* event object when there are no listeners.
*/
private JDBCEvent fireEvent(Connection source, short type,
JDBCEvent associatedEvent, Statement stmnt, String sql) {
if (!hasListeners())
return null;
JDBCEvent event = new JDBCEvent(source, type, associatedEvent,
stmnt, sql);
fireEvent(event);
return event;
}
/**
* Fire the given event to all listeners.
*/
@Override
protected void fireEvent(Object event, Object listener) {
JDBCListener listen = (JDBCListener) listener;
JDBCEvent ev = (JDBCEvent) event;
switch (ev.getType()) {
case JDBCEvent.BEFORE_PREPARE_STATEMENT:
listen.beforePrepareStatement(ev);
break;
case JDBCEvent.AFTER_PREPARE_STATEMENT:
listen.afterPrepareStatement(ev);
break;
case JDBCEvent.BEFORE_CREATE_STATEMENT:
listen.beforeCreateStatement(ev);
break;
case JDBCEvent.AFTER_CREATE_STATEMENT:
listen.afterCreateStatement(ev);
break;
case JDBCEvent.BEFORE_EXECUTE_STATEMENT:
listen.beforeExecuteStatement(ev);
break;
case JDBCEvent.AFTER_EXECUTE_STATEMENT:
listen.afterExecuteStatement(ev);
break;
case JDBCEvent.BEFORE_COMMIT:
listen.beforeCommit(ev);
break;
case JDBCEvent.AFTER_COMMIT:
listen.afterCommit(ev);
break;
case JDBCEvent.BEFORE_ROLLBACK:
listen.beforeRollback(ev);
break;
case JDBCEvent.AFTER_ROLLBACK:
listen.afterRollback(ev);
break;
case JDBCEvent.AFTER_CONNECT:
listen.afterConnect(ev);
break;
case JDBCEvent.BEFORE_CLOSE:
listen.beforeClose(ev);
break;
}
}
/**
* Fires events as appropriate.
*/
private class EventConnection extends DelegatingConnection {
public EventConnection(Connection conn) {
super(conn);
fireEvent(getDelegate(), JDBCEvent.AFTER_CONNECT, null, null, null);
}
@Override
public void commit() throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_COMMIT, null, null, null);
try {
super.commit();
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_COMMIT, before,
null, null);
}
}
@Override
public void rollback() throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_ROLLBACK, null, null, null);
try {
super.rollback();
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_ROLLBACK, before,
null, null);
}
}
@Override
protected Statement createStatement(boolean wrap) throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_CREATE_STATEMENT, null, null, null);
Statement stmnt = null;
try {
stmnt = new EventStatement(super.createStatement(false),
EventConnection.this);
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_CREATE_STATEMENT,
before, stmnt, null);
}
return stmnt;
}
@Override
protected Statement createStatement(int rsType, int rsConcur,
boolean wrap) throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_CREATE_STATEMENT, null, null, null);
Statement stmnt = null;
try {
stmnt = new EventStatement(super.createStatement
(rsType, rsConcur, false), EventConnection.this);
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_CREATE_STATEMENT,
before, stmnt, null);
}
return stmnt;
}
@Override
protected PreparedStatement prepareStatement(String sql, boolean wrap)
throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_PREPARE_STATEMENT, null, null, sql);
PreparedStatement stmnt = null;
try {
stmnt = new EventPreparedStatement(super.prepareStatement
(sql, false), EventConnection.this, sql);
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_PREPARE_STATEMENT,
before, stmnt, sql);
}
return stmnt;
}
@Override
protected PreparedStatement prepareStatement(String sql, int rsType,
int rsConcur, boolean wrap) throws SQLException {
JDBCEvent before = fireEvent(getDelegate(),
JDBCEvent.BEFORE_PREPARE_STATEMENT, null, null, sql);
PreparedStatement stmnt = null;
try {
stmnt = new EventPreparedStatement(super.prepareStatement
(sql, rsType, rsConcur, false), EventConnection.this, sql);
} finally {
fireEvent(getDelegate(), JDBCEvent.AFTER_PREPARE_STATEMENT,
before, stmnt, sql);
}
return stmnt;
}
@Override
public void close() throws SQLException {
try {
fireEvent(getDelegate(), JDBCEvent.BEFORE_CLOSE,
null, null, null);
} finally {
super.close();
}
}
}
/**
* Fires events as appropriate.
*/
private class EventPreparedStatement extends
DelegatingPreparedStatement {
private final EventConnection _conn;
private final String _sql;
public EventPreparedStatement(PreparedStatement ps,
EventConnection conn, String sql) {
super(ps, conn);
_conn = conn;
_sql = sql;
}
@Override
public int executeUpdate() throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), _sql);
try {
return super.executeUpdate();
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), _sql);
}
}
@Override
protected ResultSet executeQuery(boolean wrap) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), _sql);
try {
return super.executeQuery(wrap);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), _sql);
}
}
@Override
public int[] executeBatch() throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), _sql);
try {
return super.executeBatch();
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), _sql);
}
}
@Override
public boolean execute() throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), _sql);
try {
return super.execute();
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), _sql);
}
}
@Override
public int executeUpdate(String sql) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, int i) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, i);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, int[] ia) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, ia);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, String[] sa) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, sa);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, int i) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, i);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, int[] ia) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, ia);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, String[] sa) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, sa);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
}
/**
* Fires events as appropriate.
*/
private class EventStatement extends DelegatingStatement {
private final EventConnection _conn;
public EventStatement(Statement stmnt, EventConnection conn) {
super(stmnt, conn);
_conn = conn;
}
@Override
public int executeUpdate(String sql) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
protected ResultSet executeQuery(String sql, boolean wrap)
throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeQuery(sql, wrap);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, int i) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, i);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, int[] ia) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, ia);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public int executeUpdate(String sql, String[] sa) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.executeUpdate(sql, sa);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, int i) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, i);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, int[] ia) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, ia);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
@Override
public boolean execute(String sql, String[] sa) throws SQLException {
JDBCEvent before = fireEvent(_conn.getDelegate(),
JDBCEvent.BEFORE_EXECUTE_STATEMENT, null, getDelegate(), sql);
try {
return super.execute(sql, sa);
} finally {
fireEvent(_conn.getDelegate(),
JDBCEvent.AFTER_EXECUTE_STATEMENT, before,
getDelegate(), sql);
}
}
}
}