/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.testing.util;
import javax.persistence.LockTimeoutException;
import org.hibernate.PessimisticLockException;
import org.hibernate.exception.GenericJDBCException;
import org.hibernate.exception.JDBCConnectionException;
import org.hibernate.exception.LockAcquisitionException;
/**
* @author Vlad Mihalcea
*/
public class ExceptionUtil {
private static final ExceptionUtil INSTANCE = new ExceptionUtil();
public static ExceptionUtil getInstance() {
return INSTANCE;
}
private ExceptionUtil() {
}
/**
* Get the root cause of a particular {@code Throwable}
*
* @param t exception
*
* @return exception root cause
*/
public static Throwable rootCause(Throwable t) {
Throwable cause = t.getCause();
if ( cause != null && cause != t ) {
return rootCause( cause );
}
return t;
}
/**
* Was the given exception caused by a SQL lock timeout?
*
* @param e exception
*
* @return is caused by a SQL lock timeout
*/
public static boolean isSqlLockTimeout(Exception e) {
// grr, exception can be any number of types based on database
// see HHH-6887
if ( LockAcquisitionException.class.isInstance( e )
|| LockTimeoutException.class.isInstance( e )
|| GenericJDBCException.class.isInstance( e )
|| PessimisticLockException.class.isInstance( e )
|| javax.persistence.PessimisticLockException.class.isInstance( e )
|| JDBCConnectionException.class.isInstance( e ) ) {
return true;
}
else {
Throwable rootCause = ExceptionUtil.rootCause( e );
if ( rootCause != null && (
rootCause.getMessage().contains( "timeout" ) ||
rootCause.getMessage().contains( "timed out" ) )
) {
return true;
}
}
return false;
}
/**
* Was the given exception caused by a SQL connection close
*
* @param e exception
*
* @return is caused by a SQL connection close
*/
public static boolean isConnectionClose(Exception e) {
Throwable rootCause = ExceptionUtil.rootCause( e );
if ( rootCause != null && (
rootCause.getMessage().toLowerCase().contains( "connection is close" ) ||
rootCause.getMessage().toLowerCase().contains( "closed connection" )
) ) {
return true;
}
return false;
}
}