/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.orm.access;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import org.apache.cayenne.CayenneException;
import org.apache.cayenne.access.QueryLogger;
import org.apache.cayenne.access.Transaction;
/**
*
*/
public class CustomTransaction extends Transaction {
/**
*
*/
@Override
public void begin() {
QueryLogger.logBeginTransaction("transaction started.");
}
/**
* @throws IllegalStateException
* @throws SQLException
* @throws CayenneException
*/
@Override
public void commit() throws IllegalStateException, SQLException,
CayenneException {
try {
processCommit();
if (delegate != null) {
delegate.didCommit(this);
}
} finally {
close();
}
}
/**
* @throws IllegalStateException
* @throws SQLException
* @throws CayenneException
*/
@Override
public void rollback() throws IllegalStateException, SQLException,
CayenneException {
try {
processRollback();
if (delegate != null) {
delegate.didRollback(this);
}
} finally {
close();
}
}
@Override
public boolean addConnection(String name, Connection connection)
throws SQLException {
if (super.addConnection(name, connection)) {
if (connection.getAutoCommit()) {
try {
connection.setAutoCommit(false);
} catch (SQLException ignore) {
//
}
}
return true;
} else {
return false;
}
}
protected void close() {
if (connections == null || connections.isEmpty()) {
return;
}
@SuppressWarnings("unchecked")
Iterator<Connection> it = connections.values().iterator();
while (it.hasNext()) {
try {
it.next().close();
} catch (Throwable ignore) {
//
}
}
}
protected void processCommit() throws SQLException, CayenneException {
if (connections != null && connections.size() > 0) {
Throwable deferredException = null;
@SuppressWarnings("unchecked")
Iterator<Connection> it = connections.values().iterator();
while (it.hasNext()) {
Connection connection = it.next();
try {
if (deferredException == null) {
connection.commit();
} else {
connection.rollback();
}
} catch (Throwable th) {
deferredException = th;
}
}
if (deferredException != null) {
QueryLogger.logRollbackTransaction("transaction rolledback.");
if (deferredException instanceof SQLException) {
throw (SQLException) deferredException;
} else {
throw new CayenneException(deferredException);
}
} else {
QueryLogger.logCommitTransaction("transaction committed.");
}
}
}
protected void processRollback() throws SQLException, CayenneException {
if (connections != null && connections.size() > 0) {
Throwable deferredException = null;
@SuppressWarnings("unchecked")
Iterator<Connection> it = connections.values().iterator();
while (it.hasNext()) {
Connection connection = it.next();
try {
if (!connection.isClosed()) {
connection.rollback();
}
} catch (Throwable th) {
deferredException = th;
}
}
if (deferredException != null) {
if (deferredException instanceof SQLException) {
throw (SQLException) deferredException;
} else {
throw new CayenneException(deferredException);
}
} else {
QueryLogger.logRollbackTransaction("transaction rolledback.");
}
}
}
}