proper fix for CqInvalidException that was removed in GemFire 6.5
a fallback/introspection mechanism is now used to discover whether the exception is present and if so, treat it correctly
This commit is contained in:
Costin Leau
2010-10-26 13:27:03 +03:00
parent 0683ce2752
commit 70ce353dfe
5 changed files with 55 additions and 49 deletions

View File

@@ -36,9 +36,6 @@ import com.gemstone.gemfire.GemFireException;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheClosedException;
import com.gemstone.gemfire.cache.CacheFactory;
// /* TODO Check 6.0 and 6.5 compatibility import com.gemstone.gemfire.cache.query.CqInvalidException;
import com.gemstone.gemfire.cache.query.IndexInvalidException;
import com.gemstone.gemfire.cache.query.QueryInvalidException;
import com.gemstone.gemfire.distributed.DistributedMember;
import com.gemstone.gemfire.distributed.DistributedSystem;
@@ -139,15 +136,10 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl
return GemfireCacheUtils.convertGemfireAccessException((GemFireException) ex);
}
if (ex instanceof IllegalArgumentException) {
if (ex instanceof IndexInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((IndexInvalidException) ex);
}
/* TODO Add back some mapping to be compatible with 6.0 and 6.0
if (ex instanceof CqInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((CqInvalidException) ex);
}*/
if (ex instanceof QueryInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((QueryInvalidException) ex);
DataAccessException wrapped = GemfireCacheUtils.convertQueryExceptions(ex);
// ignore conversion if the generic exception is returned
if (!(wrapped instanceof GemfireSystemException)) {
return wrapped;
}
}

View File

@@ -24,9 +24,6 @@ import org.springframework.dao.DataAccessException;
import com.gemstone.gemfire.GemFireCheckedException;
import com.gemstone.gemfire.GemFireException;
import com.gemstone.gemfire.cache.Region;
// TODO Check 6.0 and 6.5 compatibility import com.gemstone.gemfire.cache.query.CqInvalidException;
import com.gemstone.gemfire.cache.query.IndexInvalidException;
import com.gemstone.gemfire.cache.query.QueryInvalidException;
/**
* Base class for GemfireTemplate and GemfireInterceptor, defining common properties such as {@link Region}.
@@ -81,20 +78,7 @@ public class GemfireAccessor implements InitializingBean {
* @return the corresponding DataAccessException instance
*/
public DataAccessException convertGemFireQueryException(RuntimeException ex) {
/* TODO Check 6.0 and 6.5 compatibility
if (ex instanceof CqInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((CqInvalidException) ex);
}*/
if (ex instanceof IndexInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((IndexInvalidException) ex);
}
if (ex instanceof QueryInvalidException) {
return GemfireCacheUtils.convertGemfireAccessException((QueryInvalidException) ex);
}
return new GemfireSystemException(ex);
return GemfireCacheUtils.convertQueryExceptions(ex);
}
/**

View File

@@ -26,6 +26,7 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.dao.PermissionDeniedDataAccessException;
import org.springframework.dao.PessimisticLockingFailureException;
import org.springframework.dao.TypeMismatchDataAccessException;
import org.springframework.util.ClassUtils;
import com.gemstone.gemfire.CancelException;
import com.gemstone.gemfire.CopyException;
@@ -72,7 +73,6 @@ import com.gemstone.gemfire.cache.VersionException;
import com.gemstone.gemfire.cache.client.ServerConnectivityException;
import com.gemstone.gemfire.cache.execute.FunctionException;
import com.gemstone.gemfire.cache.query.CqClosedException;
// TODO Check 6.0 and 6.5 compatibility import com.gemstone.gemfire.cache.query.CqInvalidException;
import com.gemstone.gemfire.cache.query.IndexInvalidException;
import com.gemstone.gemfire.cache.query.IndexMaintenanceException;
import com.gemstone.gemfire.cache.query.QueryException;
@@ -88,6 +88,23 @@ import com.gemstone.gemfire.security.GemFireSecurityException;
*/
public abstract class GemfireCacheUtils {
private static Class<?> CQ_EXCEPTION_CLASS;
{
Class<?> clz = null;
try {
clz = ClassUtils.resolveClassName("com.gemstone.gemfire.cache.query.CqInvalidException",
GemfireCacheUtils.class.getClassLoader());
} catch (IllegalArgumentException iae) {
}
CQ_EXCEPTION_CLASS = clz;
}
/**
* Converts the given (unchecked) Gemfire exception to an appropriate one from the
* <code>org.springframework.dao</code> hierarchy.
@@ -250,19 +267,20 @@ public abstract class GemfireCacheUtils {
* @param ex
* @return
*/
private static DataAccessException convertQueryExceptions(RuntimeException ex) {
static DataAccessException convertQueryExceptions(RuntimeException ex) {
if (ex instanceof IndexInvalidException) {
return convertGemfireAccessException((IndexInvalidException) ex);
}
if (ex instanceof QueryInvalidException) {
return convertGemfireAccessException((QueryInvalidException) ex);
}
/* TODO Check 6.0 and 6.5 compatibility
if (ex instanceof CqInvalidException) {
return convertGemfireAccessException((CqInvalidException) ex);
if (isCqInvalidException(ex)) {
return convertCqInvalidException(ex);
}
*/
return null;
// fall back
return new GemfireSystemException(ex);
}
/**
@@ -317,16 +335,25 @@ public abstract class GemfireCacheUtils {
return new GemfireQueryException(ex);
}
/**
* Package protected method for detecting CqInvalidException which has been removed in GemFire 6.5 GA.
*
* @param ex
* @return
*/
static boolean isCqInvalidException(RuntimeException ex) {
return (CQ_EXCEPTION_CLASS != null && CQ_EXCEPTION_CLASS.isAssignableFrom(ex.getClass()));
}
/**
* Converts the given (unchecked) Gemfire exception to an appropriate one from the
* <code>org.springframework.dao</code> hierarchy. This method exists to handle backwards compatibility
* for exceptions that had their parents changed in GemFire 6.5.
* for exceptions that have been removed in 6.5.
*
* @param ex Gemfire unchecked exception
* @return new the corresponding DataAccessException instance
*/
/* TODO Check 6.0 and 6.5 compatibility
public static DataAccessException convertGemfireAccessException(CqInvalidException ex) {
static DataAccessException convertCqInvalidException(RuntimeException ex) {
return new GemfireQueryException(ex);
}*/
}
}

View File

@@ -18,7 +18,6 @@ package org.springframework.data.gemfire;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
//TODO Check 6.0 and 6.5 compatibility import com.gemstone.gemfire.cache.query.CqInvalidException;
import com.gemstone.gemfire.cache.query.QueryException;
import com.gemstone.gemfire.cache.query.QueryExecutionTimeoutException;
import com.gemstone.gemfire.cache.query.QueryInvalidException;
@@ -43,8 +42,13 @@ public class GemfireQueryException extends InvalidDataAccessResourceUsageExcepti
super(ex.getMessage(), ex);
}
/* TODO Check 6.0 and 6.5 compatibility
public GemfireQueryException(CqInvalidException ex) {
/**
* Dedicated constructor for CqInvalidException. Since the class has been removed in 6.5,
* the constructor is protected to prevent illegal access.
*
* @param ex
*/
GemfireQueryException(RuntimeException ex) {
super(ex.getMessage(), ex);
}*/
}
}

View File

@@ -28,7 +28,6 @@ import org.springframework.util.ClassUtils;
import com.gemstone.gemfire.GemFireCheckedException;
import com.gemstone.gemfire.GemFireException;
import com.gemstone.gemfire.cache.Region;
//TODO Check 6.0 and 6.5 compatibility import com.gemstone.gemfire.cache.query.CqInvalidException;
import com.gemstone.gemfire.cache.query.IndexInvalidException;
import com.gemstone.gemfire.cache.query.QueryInvalidException;
import com.gemstone.gemfire.cache.query.SelectResults;
@@ -119,10 +118,6 @@ public class GemfireTemplate extends GemfireAccessor {
return result;
} catch (IndexInvalidException ex) {
throw convertGemFireQueryException(ex);
/* TODO Check 6.0 and 6.5 compatibility
} catch (CqInvalidException ex) {
throw convertGemFireQueryException(ex);
*/
} catch (QueryInvalidException ex) {
throw convertGemFireQueryException(ex);
} catch (GemFireCheckedException ex) {
@@ -130,6 +125,10 @@ public class GemfireTemplate extends GemfireAccessor {
} catch (GemFireException ex) {
throw convertGemFireAccessException(ex);
} catch (RuntimeException ex) {
// try first the CqInvalidException (removed in 6.5)
if (GemfireCacheUtils.isCqInvalidException(ex)) {
throw GemfireCacheUtils.convertCqInvalidException(ex);
}
// callback code threw application exception
throw ex;
}