diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraExceptionTranslator.java b/src/main/java/org/springframework/data/cassandra/core/CassandraExceptionTranslator.java index 9c08e05ac..64944b823 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraExceptionTranslator.java +++ b/src/main/java/org/springframework/data/cassandra/core/CassandraExceptionTranslator.java @@ -16,37 +16,83 @@ package org.springframework.data.cassandra.core; import org.springframework.dao.DataAccessException; -import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.data.cassandra.core.exceptions.*; -import com.datastax.driver.core.exceptions.InvalidQueryException; +import com.datastax.driver.core.exceptions.*; /** - * Simple {@link PersistenceExceptionTranslator} for Cassandra. Convert the given runtime exception to an appropriate - * exception from the {@code org.springframework.dao} hierarchy. Return {@literal null} if no translation is - * appropriate: any other exception may have resulted from user code, and should not be translated. + * Simple {@link PersistenceExceptionTranslator} for Cassandra. Convert the + * given runtime exception to an appropriate exception from the + * {@code org.springframework.dao} hierarchy. Return {@literal null} if no + * translation is appropriate: any other exception may have resulted from user + * code, and should not be translated. * * @author Alex Shvid + * @author Matthew T. Adams */ -public class CassandraExceptionTranslator implements PersistenceExceptionTranslator { +public class CassandraExceptionTranslator implements + PersistenceExceptionTranslator { /* * (non-Javadoc) - * @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException) + * + * @see org.springframework.dao.support.PersistenceExceptionTranslator# + * translateExceptionIfPossible(java.lang.RuntimeException) */ - public DataAccessException translateExceptionIfPossible(RuntimeException ex) { + public DataAccessException translateExceptionIfPossible(RuntimeException x) { - // Check for well-known Cassandra subclasses. - - if (ex instanceof InvalidQueryException) { - return new DataAccessResourceFailureException(ex.getMessage(), ex); + if (!(x instanceof DriverException)) { + return null; } - - // If we get here, we have an exception that resulted from user code, - // rather than the persistence provider, so we return null to indicate - // that translation should not occur. - return null; + + if (x instanceof AuthenticationException) { + return new CassandraAuthenticationException(x.getMessage(), x); + } + if (x instanceof DriverInternalError) { + return new CassandraDriverInternalErrorException(x.getMessage(), x); + } + if (x instanceof InvalidTypeException) { + return new CassandraInvalidTypeException(x.getMessage(), x); + } + if (x instanceof NoHostAvailableException) { + return new CassandraNoHostAvailableException(x.getMessage(), x); + } + if (x instanceof ReadTimeoutException) { + return new CassandraReadTimeoutException(x.getMessage(), x); + } + if (x instanceof WriteTimeoutException) { + return new CassandraWriteTimeoutException(x.getMessage(), x); + } + if (x instanceof TruncateException) { + return new CassandraTruncateException(x.getMessage(), x); + } + if (x instanceof UnavailableException) { + return new CassandraUnavailableException(x.getMessage(), x); + } + if (x instanceof AlreadyExistsException) { + return new CassandraAlreadyExistsException(x.getMessage(), x); + } + if (x instanceof InvalidConfigurationInQueryException) { + return new CassandraInvalidConfigurationInQueryException( + x.getMessage(), x); + } + // this must come after cases for subclasses + if (x instanceof InvalidQueryException) { + return new CassandraInvalidQueryException(x.getMessage(), x); + } + if (x instanceof SyntaxError) { + return new CassandraSyntaxErrorException(x.getMessage(), x); + } + if (x instanceof UnauthorizedException) { + return new CassandraUnauthorizedException(x.getMessage(), x); + } + if (x instanceof TraceRetrievalException) { + return new CassandraTraceRetrievalException(x.getMessage(), x); + } + + // unknown or unhandled exception + return new CassandraUncategorizedException(x.getMessage(), x); } - } diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java b/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java index 1a001ef06..d2ce64c53 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java +++ b/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java @@ -25,6 +25,7 @@ import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.data.cassandra.convert.CassandraConverter; +import org.springframework.data.cassandra.core.exceptions.CassandraConnectionFailureException; import org.springframework.data.cassandra.mapping.CassandraPersistentEntity; import org.springframework.data.cassandra.mapping.CassandraPersistentProperty; import org.springframework.data.cassandra.vo.RingMember; diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAlreadyExistsException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAlreadyExistsException.java new file mode 100644 index 000000000..5e010b781 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAlreadyExistsException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.NonTransientDataAccessException; + +public class CassandraAlreadyExistsException extends + NonTransientDataAccessException { + + private static final long serialVersionUID = 6032967419751410352L; + + public CassandraAlreadyExistsException(String msg) { + super(msg); + } + + public CassandraAlreadyExistsException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAuthenticationException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAuthenticationException.java new file mode 100644 index 000000000..f435568aa --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraAuthenticationException.java @@ -0,0 +1,13 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.PermissionDeniedDataAccessException; + +public class CassandraAuthenticationException extends + PermissionDeniedDataAccessException { + + private static final long serialVersionUID = 8556304586797273927L; + + public CassandraAuthenticationException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraConnectionFailureException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraConnectionFailureException.java similarity index 88% rename from src/main/java/org/springframework/data/cassandra/core/CassandraConnectionFailureException.java rename to src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraConnectionFailureException.java index 194113f93..360554bd5 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraConnectionFailureException.java +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraConnectionFailureException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.core; +package org.springframework.data.cassandra.core.exceptions; import org.springframework.dao.DataAccessResourceFailureException; @@ -24,6 +24,8 @@ import org.springframework.dao.DataAccessResourceFailureException; */ public class CassandraConnectionFailureException extends DataAccessResourceFailureException { + private static final long serialVersionUID = 4856524591258560460L; + public CassandraConnectionFailureException(String msg) { super(msg); } diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraDriverInternalErrorException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraDriverInternalErrorException.java new file mode 100644 index 000000000..84b8cffc3 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraDriverInternalErrorException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.DataAccessResourceFailureException; + +public class CassandraDriverInternalErrorException extends + DataAccessResourceFailureException { + + private static final long serialVersionUID = 433061676465346338L; + + public CassandraDriverInternalErrorException(String msg) { + super(msg); + } + + public CassandraDriverInternalErrorException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidConfigurationInQueryException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidConfigurationInQueryException.java new file mode 100644 index 000000000..50ad6f682 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidConfigurationInQueryException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.InvalidDataAccessApiUsageException; + +public class CassandraInvalidConfigurationInQueryException extends + InvalidDataAccessApiUsageException { + + private static final long serialVersionUID = 4594321191806182918L; + + public CassandraInvalidConfigurationInQueryException(String msg) { + super(msg); + } + + public CassandraInvalidConfigurationInQueryException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidQueryException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidQueryException.java new file mode 100644 index 000000000..b8c20e129 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidQueryException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.InvalidDataAccessApiUsageException; + +public class CassandraInvalidQueryException extends + InvalidDataAccessApiUsageException { + + private static final long serialVersionUID = 4594321191806182918L; + + public CassandraInvalidQueryException(String msg) { + super(msg); + } + + public CassandraInvalidQueryException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidTypeException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidTypeException.java new file mode 100644 index 000000000..2a061f962 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraInvalidTypeException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.TypeMismatchDataAccessException; + +public class CassandraInvalidTypeException extends + TypeMismatchDataAccessException { + + private static final long serialVersionUID = -7420058975444905629L; + + public CassandraInvalidTypeException(String msg) { + super(msg); + } + + public CassandraInvalidTypeException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraNoHostAvailableException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraNoHostAvailableException.java new file mode 100644 index 000000000..ac6d64cc5 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraNoHostAvailableException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.DataAccessResourceFailureException; + +public class CassandraNoHostAvailableException extends + DataAccessResourceFailureException { + + private static final long serialVersionUID = 6299912054261646552L; + + public CassandraNoHostAvailableException(String msg) { + super(msg); + } + + public CassandraNoHostAvailableException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraReadTimeoutException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraReadTimeoutException.java new file mode 100644 index 000000000..bcfcd726a --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraReadTimeoutException.java @@ -0,0 +1,16 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.QueryTimeoutException; + +public class CassandraReadTimeoutException extends QueryTimeoutException { + + private static final long serialVersionUID = -787022307935203387L; + + public CassandraReadTimeoutException(String msg) { + super(msg); + } + + public CassandraReadTimeoutException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraSyntaxErrorException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraSyntaxErrorException.java new file mode 100644 index 000000000..e61b112f0 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraSyntaxErrorException.java @@ -0,0 +1,16 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.InvalidDataAccessApiUsageException; + +public class CassandraSyntaxErrorException extends InvalidDataAccessApiUsageException { + + private static final long serialVersionUID = 4398474399882434154L; + + public CassandraSyntaxErrorException(String msg) { + super(msg); + } + + public CassandraSyntaxErrorException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTraceRetrievalException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTraceRetrievalException.java new file mode 100644 index 000000000..3db539ed1 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTraceRetrievalException.java @@ -0,0 +1,17 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.TransientDataAccessException; + +public class CassandraTraceRetrievalException extends + TransientDataAccessException { + + private static final long serialVersionUID = -3163557220324700239L; + + public CassandraTraceRetrievalException(String msg) { + super(msg); + } + + public CassandraTraceRetrievalException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTruncateException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTruncateException.java new file mode 100644 index 000000000..f82d08eb2 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraTruncateException.java @@ -0,0 +1,16 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.TransientDataAccessException; + +public class CassandraTruncateException extends TransientDataAccessException { + + private static final long serialVersionUID = 5730642491362430311L; + + public CassandraTruncateException(String msg) { + super(msg); + } + + public CassandraTruncateException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnauthorizedException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnauthorizedException.java new file mode 100644 index 000000000..4bc6730e7 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnauthorizedException.java @@ -0,0 +1,13 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.PermissionDeniedDataAccessException; + +public class CassandraUnauthorizedException extends + PermissionDeniedDataAccessException { + + private static final long serialVersionUID = 4618185356687726647L; + + public CassandraUnauthorizedException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnavailableException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnavailableException.java new file mode 100644 index 000000000..1712edad2 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUnavailableException.java @@ -0,0 +1,16 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.ConcurrencyFailureException; + +public class CassandraUnavailableException extends ConcurrencyFailureException { + + private static final long serialVersionUID = 6415130674604814905L; + + public CassandraUnavailableException(String msg) { + super(msg); + } + + public CassandraUnavailableException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/src/main/java/org/springframework/data/cassandra/core/CassandraSystemException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUncategorizedException.java similarity index 75% rename from src/main/java/org/springframework/data/cassandra/core/CassandraSystemException.java rename to src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUncategorizedException.java index cbbbfc0da..261ca49b1 100644 --- a/src/main/java/org/springframework/data/cassandra/core/CassandraSystemException.java +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraUncategorizedException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.core; +package org.springframework.data.cassandra.core.exceptions; import org.springframework.dao.UncategorizedDataAccessException; @@ -23,10 +23,11 @@ import org.springframework.dao.UncategorizedDataAccessException; * @author Alex Shvid */ -public class CassandraSystemException extends UncategorizedDataAccessException { +public class CassandraUncategorizedException extends UncategorizedDataAccessException { - public CassandraSystemException(String msg, Throwable cause) { + private static final long serialVersionUID = 1029525121238025444L; + + public CassandraUncategorizedException(String msg, Throwable cause) { super(msg, cause); } - } diff --git a/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraWriteTimeoutException.java b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraWriteTimeoutException.java new file mode 100644 index 000000000..04e87d286 --- /dev/null +++ b/src/main/java/org/springframework/data/cassandra/core/exceptions/CassandraWriteTimeoutException.java @@ -0,0 +1,16 @@ +package org.springframework.data.cassandra.core.exceptions; + +import org.springframework.dao.QueryTimeoutException; + +public class CassandraWriteTimeoutException extends QueryTimeoutException { + + private static final long serialVersionUID = -4374826375213670718L; + + public CassandraWriteTimeoutException(String msg) { + super(msg); + } + + public CassandraWriteTimeoutException(String msg, Throwable cause) { + super(msg, cause); + } +}