package dk.hansen;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
public class JDBCTransaction implements JDBCTransactionIF {
private static Logger logger = Logger.getLogger(JDBCTransaction.class
.getName());
private DataSource dataSource;
private Connection connection;
public void begin() throws DAOException {
logger.debug("Begin transaction");
createConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e) {
throw new DAOException("Could not set autocommit", e);
}
}
public void end() throws DAOException {
try {
logger.debug("End transaction");
connection.commit();
} catch (SQLException e) {
try {
close();
} catch (DAOException de) {
logger.error("Close failed after commit failed", de);
}
throw new DAOException("Could not commit", e);
}
try {
close();
} catch (DAOException e) {
throw new DAOException("Could not close", e);
}
}
public void rollback() throws DAOException {
try {
logger.debug("Rollback transaction");
connection.rollback();
} catch (SQLException e) {
try {
close();
} catch (DAOException de) {
logger.error("Close failed after rollback failed", de);
}
throw new DAOException("Could not rollback", e);
}
try {
close();
} catch (DAOException e) {
throw new DAOException("Could not close", e);
}
}
private void close() throws DAOException {
try {
logger.debug("Close connection");
connection.close();
connection = null;
} catch (SQLException e) {
throw new DAOException("Could not close the connection", e);
}
}
public void setDataSource(DataSource ds) {
dataSource = ds;
}
public Connection getConnection() throws DAOException {
logger.debug("Get a connection");
try {
if (connection == null || connection.isClosed())
createConnection();
} catch (SQLException e) {
throw new DAOException("Could not check if connection was closed", e);
}
logger.debug("Connection " + connection + " returned");
return connection;
}
private void createConnection() throws DAOException {
try {
connection = dataSource.getConnection();
logger.debug("New Connection created");
} catch (SQLException e) {
throw new DAOException("Could not create connection", e);
}
}
}