package org.springframework.data.simpledb.exception; import org.springframework.dao.*; import org.springframework.dao.support.PersistenceExceptionTranslator; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.cloudwatch.model.ResourceNotFoundException; import com.amazonaws.services.simpledb.model.*; /** * Simple {@link PersistenceExceptionTranslator} for SimpleDB. Translated the runtime exception to an appropriate * {@code org.springframework.dao} exception * */ public final class SimpleDbExceptionTranslator implements PersistenceExceptionTranslator { private static SimpleDbExceptionTranslator instance; private SimpleDbExceptionTranslator() { } public static synchronized SimpleDbExceptionTranslator getTranslatorInstance() { if(instance == null) { instance = new SimpleDbExceptionTranslator(); } return instance; } public RuntimeException translateAmazonClientException(AmazonClientException e) { RuntimeException translatedException = getTranslatorInstance().translateExceptionIfPossible(e); if(translatedException == null) { translatedException = e; } return translatedException; } @Override public DataAccessException translateExceptionIfPossible(RuntimeException e) { final String errorMessage = e.getLocalizedMessage(); if(e instanceof DuplicateItemNameException) { return new DuplicateKeyException(errorMessage, e); } // The specified attribute does not exist. if(e instanceof AttributeDoesNotExistException) { return new EmptyResultDataAccessException(errorMessage, -1); } if(e instanceof ResourceNotFoundException) { return new DataRetrievalFailureException(errorMessage, e); } if(e instanceof InvalidParameterValueException) { return new InvalidDataAccessResourceUsageException(errorMessage, e); } if(e instanceof NoSuchDomainException) { return new EmptyResultDataAccessException(errorMessage, -1); } if((e instanceof NumberDomainAttributesExceededException) || (e instanceof NumberDomainsExceededException)) { return new DataIntegrityViolationException(errorMessage, e); } if((e instanceof InvalidNextTokenException) || (e instanceof TooManyRequestedAttributesException) || (e instanceof MissingParameterException) ) { return new InvalidDataAccessApiUsageException(errorMessage, e); } if(e instanceof AmazonServiceException) { return new DataAccessResourceFailureException(errorMessage, e); } // Amazon Internal Exception if(e instanceof AmazonClientException) { return new UncategorizedSpringDaoException(errorMessage, e); } // this line means that spring-data exceptions will not be translated to DataAccessException, being interpreted // as they are from the SimpleDB Template return null; } }