/*
* Copyright 2005 Stein M. Hugubakken, Ralf Joachim
*
* 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 org.castor.jdo.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.castor.core.util.Messages;
import org.castor.jdo.engine.DatabaseContext;
import org.castor.jdo.engine.DatabaseRegistry;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.mapping.ClassDescriptor;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.persist.ClassMolder;
/**
* Common static methods for Castor JDO.
*
* @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
* @author <a href="mailto:dulci AT start DOT no">Stein M. Hugubakken</a>
* @version $Revision$ $Date: 2006-05-24 08:49:08 -0600 (Wed, 24 May 2006) $
* @since 0.9.9.1
*/
public final class JDOUtils {
//-------------------------------------------------------------------------
/**
* The <a href="http://jakarta.apache.org/commons/logging/">Jakarta Commons
* Logging </a> instance used for all logging.
*/
private static final Log LOG = LogFactory.getLog(JDOUtils.class);
//-------------------------------------------------------------------------
/**
* Closes the Connection without throwing SQLException. A warning is added
* to the log if SQLException is thrown.
*
* @param conn The Connection to close
*/
public static void closeConnection(final Connection conn) {
if (conn != null) {
try {
if (!conn.isClosed()) { conn.close(); }
} catch (SQLException e) {
LOG.warn(Messages.message("persist.connClosingFailed"), e);
}
}
}
/**
* Closes the ResultSet without throwing SQLException. A warning is added to
* the log if SQLException is thrown.
*
* @param rs The ResultSet to close
*/
public static void closeResultSet(final ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
LOG.warn(Messages.message("persist.rsClosingFailed"), e);
}
}
}
/**
* Closes the Statement without throwing SQLException. A warning is added to
* the log if SQLException is thrown.
*
* @param stmt The Statement to close
*/
public static void closeStatement(final Statement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
LOG.warn(Messages.message("persist.stClosingFailed"), e);
}
}
}
/**
* Closes the Database without throwing exceptions. An active transaction will
* silently rolled back. Warnings are added to the log if any exception occures.
*
* @param db The database to close.
*/
public static void closeDatabase(final Database db) {
if ((db != null) && !db.isClosed()) {
synchronized (db) {
if (db.isActive()) {
// if transction is still active it will be rolled back.
try {
db.rollback();
} catch (Exception e) {
// this should never happen but anyway we log it
LOG.warn("Failed to rollback an active transaction.", e);
}
}
if (!db.isClosed()) {
// database is not closed but should be commited or rolled back now,
// so we can close it now.
try {
db.close();
} catch (Exception e) {
// this should never happen but anyway we log it
LOG.warn("Failed to close an open database.", e);
}
}
}
}
}
/**
* Return ClassDescriptor for given type in named database .
*
* @param db The database's name.
* @param type The class.
* @return ClassDescriptor if exists, otherwise null.
* @throws MappingException If database can not be instantiated.
*/
public static ClassDescriptor getClassDescriptor(final String db, final Class<?> type)
throws MappingException {
DatabaseContext context = DatabaseRegistry.getDatabaseContext(db);
ClassMolder molder = context.getEngine().getClassMolderWithDependent(type);
return molder.getClassDescriptor();
}
//-------------------------------------------------------------------------
/**
* Hide default constructor of utility classes.
*/
private JDOUtils() { }
//-------------------------------------------------------------------------
}