From 810130858c5171889ff9e3bd6caee3b0dd54eb28 Mon Sep 17 00:00:00 2001 From: Michael Nitschinger Date: Thu, 7 Feb 2013 16:29:09 +0100 Subject: [PATCH] Adding the exception translator --- pom.xml | 5 ++ .../core/CouchbaseExceptionTranslator.java | 60 +++++++++++++++++++ .../spring/core/CouchbaseTemplate.java | 7 +++ 3 files changed, 72 insertions(+) create mode 100644 src/main/java/com/couchbase/spring/core/CouchbaseExceptionTranslator.java diff --git a/pom.xml b/pom.xml index dc62902e..e7f28063 100644 --- a/pom.xml +++ b/pom.xml @@ -77,5 +77,10 @@ jackson-mapper-asl 1.9.12 + + org.springframework + spring-tx + 3.2.1.RELEASE + diff --git a/src/main/java/com/couchbase/spring/core/CouchbaseExceptionTranslator.java b/src/main/java/com/couchbase/spring/core/CouchbaseExceptionTranslator.java new file mode 100644 index 00000000..271a9a9d --- /dev/null +++ b/src/main/java/com/couchbase/spring/core/CouchbaseExceptionTranslator.java @@ -0,0 +1,60 @@ +/** + * Copyright (C) 2009-2012 Couchbase, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING + * IN THE SOFTWARE. + */ + +package com.couchbase.spring.core; + +import org.springframework.dao.DataAccessException; +import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.support.PersistenceExceptionTranslator; + +import com.couchbase.client.ObservedException; +import com.couchbase.client.ObservedModifiedException; +import com.couchbase.client.ObservedTimeoutException; +import com.couchbase.client.vbucket.ConnectionException; + +/** + * Simple {@link PersistenceExceptionTranslator} for Couchbase. + * + * 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. + */ +public class CouchbaseExceptionTranslator implements PersistenceExceptionTranslator { + + @Override + public DataAccessException translateExceptionIfPossible(RuntimeException ex) { + if(ex instanceof ConnectionException) { + return new DataAccessResourceFailureException(ex.getMessage(), ex); + } + + if(ex instanceof ObservedException || + ex instanceof ObservedTimeoutException || + ex instanceof ObservedModifiedException) { + return new DataIntegrityViolationException(ex.getMessage(), ex); + } + + return null; + } + +} diff --git a/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java b/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java index 5c342ba0..f0628fd1 100644 --- a/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java +++ b/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java @@ -45,6 +45,8 @@ public class CouchbaseTemplate implements CouchbaseOperations { protected final MappingContext, CouchbasePersistentProperty> mappingContext; private static final Collection ITERABLE_CLASSES; + private final CouchbaseExceptionTranslator exceptionTranslator = + new CouchbaseExceptionTranslator(); static { Set iterableClasses = new HashSet(); @@ -138,6 +140,11 @@ public class CouchbaseTemplate implements CouchbaseOperations { } } } + + private RuntimeException potentiallyConvertRuntimeException(RuntimeException ex) { + RuntimeException resolved = this.exceptionTranslator.translateExceptionIfPossible(ex); + return resolved == null ? ex : resolved; + } }