/* * 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.SQLException; import java.sql.Statement; /** * Connection decorator that can configure some properties of the * underlying connection. Understands the following properties: * <ul> * <li>QueryTimeout</li> * <li>TransactionIsolation({@link Connection} constants)</li> * <li>AutoCommit</li> * </ul> * * @author Abe White */ public class ConfiguringConnectionDecorator implements ConnectionDecorator { private int _isolation = -1; private int _queryTimeout = -1; private Boolean _autoCommit = null; /** * The number of seconds to wait for a query to execute before * terminating it. */ public int getQueryTimeout() { return _queryTimeout; } /** * The number of seconds to wait for a query to execute before * terminating it. */ public void setQueryTimeout(int timeout) { _queryTimeout = timeout; } /** * The transaction isolation level. */ public int getTransactionIsolation() { return _isolation; } /** * The transaction isolation level. */ public void setTransactionIsolation(int isolation) { _isolation = isolation; } /** * Whether auto commit should be on. Use null to keep * the connection's default setting. Defaults to null. */ public Boolean getAutoCommit() { return _autoCommit; } /** * Whether auto commit should be on. Use null to keep * the connection's default setting. Defaults to null. */ public void setAutoCommit(Boolean autoCommit) { _autoCommit = autoCommit; } public Connection decorate(Connection conn) throws SQLException { if (_isolation == Connection.TRANSACTION_NONE || _queryTimeout != -1 || _autoCommit != null) conn = new ConfiguringConnection(conn); if (_isolation != -1 && _isolation != Connection.TRANSACTION_NONE) conn.setTransactionIsolation(_isolation); return conn; } /** * Decorator to configure connection components correctly. */ public class ConfiguringConnection extends DelegatingConnection { private boolean _curAutoCommit = false; public ConfiguringConnection(Connection conn) throws SQLException { super(conn); if (_autoCommit != null) { _curAutoCommit = ConfiguringConnection.this.getAutoCommit(); if (_curAutoCommit != _autoCommit.booleanValue()) setAutoCommit(_autoCommit.booleanValue()); } } public void setAutoCommit(boolean auto) throws SQLException { if (_isolation != TRANSACTION_NONE) { super.setAutoCommit(auto); _curAutoCommit = auto; } } public void commit() throws SQLException { if (_isolation != TRANSACTION_NONE) super.commit(); if (_autoCommit != null && _autoCommit.booleanValue() != _curAutoCommit) setAutoCommit(_autoCommit.booleanValue()); } public void rollback() throws SQLException { if (_isolation != TRANSACTION_NONE) super.rollback(); if (_autoCommit != null && _autoCommit.booleanValue() != _curAutoCommit) setAutoCommit(_autoCommit.booleanValue()); } protected PreparedStatement prepareStatement(String sql, boolean wrap) throws SQLException { PreparedStatement stmnt = super.prepareStatement(sql, wrap); if (_queryTimeout != -1) stmnt.setQueryTimeout(_queryTimeout); return stmnt; } protected PreparedStatement prepareStatement(String sql, int rsType, int rsConcur, boolean wrap) throws SQLException { PreparedStatement stmnt = super.prepareStatement(sql, rsType, rsConcur, wrap); if (_queryTimeout != -1) stmnt.setQueryTimeout(_queryTimeout); return stmnt; } protected Statement createStatement(boolean wrap) throws SQLException { Statement stmnt = super.createStatement(wrap); if (_queryTimeout != -1) stmnt.setQueryTimeout(_queryTimeout); return stmnt; } protected Statement createStatement(int rsType, int rsConcur, boolean wrap) throws SQLException { Statement stmnt = super.createStatement(rsType, rsConcur, wrap); if (_queryTimeout != -1) stmnt.setQueryTimeout(_queryTimeout); return stmnt; } } }