/**
* Copyright 2009 ATG DUST Project
*
* Licensed 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 atg.adapter.gsa;
import java.sql.Connection;
import java.sql.SQLException;
import javax.transaction.InvalidTransactionException;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
class DoInAutoCommit {
private final GSARepositorySchemaGenerator mAutoCommit;
GSARepository mRepository = null;
Logger mLogger = Logger.getLogger(DoInAutoCommit.class);
/**
* Creates a new DoInAutoCommit which operates on the given repository.
* This class is used to allow code to be executed with autoCommit=true on
* its database connection. This class will suspend the current transaction
* if any before setting autoCommit=true. The transaction is resumed and
* autoCommit is returned to its original state after work is performed.
*
* @param pRepository
* @param pGsaRepositorySchemaGenerator TODO
*/
public DoInAutoCommit(GSARepositorySchemaGenerator pGsaRepositorySchemaGenerator, GSARepository pRepository) {
mAutoCommit = pGsaRepositorySchemaGenerator;
mRepository = pRepository;
}
/**
* Executes the given work using the connections and logging of the
* repository passed into the constructor of this class. Returns true if the
* work was competed without any exceptions.
*
* @param pWork
*/
public boolean doInAutoCommit(AutoCommitable pWork) {
Transaction suspended = null;
boolean success = false;
try {
// Suspend the Current Transaction so we can set autoCommit=true
// Otherwise MSSQL will hang
suspended = mRepository.getTransactionManager().suspend();
Connection c = mRepository.getConnection();
mLogger.debug("autoCommit = " + c.getAutoCommit() + " connection=" + c);
boolean savedAutoCommit = c.getAutoCommit();
mLogger.debug("Setting auto commit = true on connection " + c);
c.setAutoCommit(true);
try {
pWork.doInAutoCommit(c);
success = true;
} finally {
if (c != null) {
mLogger.debug("Reverting autoCommit back to " + savedAutoCommit);
c.setAutoCommit(savedAutoCommit);
}
if (suspended != null) {
try {
mRepository.getTransactionManager().resume(suspended);
} catch (InvalidTransactionException e) {
if (mRepository.isLoggingError())
mLogger.error("error in autocommit ", e);
} catch (IllegalStateException e) {
if (mRepository.isLoggingError())
mLogger.error("error in autocommit ", e);
}
}
}
} catch (SystemException e) {
if (mRepository.isLoggingError())
mLogger.error("error in autocommit ", e);
} catch (SQLException e) {
if (mRepository.isLoggingError())
mLogger.error("error in autocommit ", e);
}
return success;
}
}