diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistrar.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistrar.java index e9806b8c0b..0d15a87025 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistrar.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistrar.java @@ -16,53 +16,42 @@ package org.springframework.jdbc.support; -import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import org.springframework.beans.factory.InitializingBean; /** - * Registry for registering custom {@link org.springframework.jdbc.support.SQLExceptionTranslator}. + * Registry for registering custom {@link org.springframework.jdbc.support.SQLExceptionTranslator} + * instances for specific databases. * * @author Thomas Risberg - * @since 3.1 + * @since 3.1.1 */ public class CustomSQLExceptionTranslatorRegistrar implements InitializingBean { - private static final Log logger = LogFactory.getLog(CustomSQLExceptionTranslatorRegistrar.class); - /** * Map registry to hold custom translators specific databases. * Key is the database product name as defined in the * {@link org.springframework.jdbc.support.SQLErrorCodesFactory}. */ - private final Map sqlExceptionTranslators = - new HashMap(); + private final Map translators = new HashMap(); + /** - * Setter for a Map of translators where the key must be the database name as defined in the - * sql-error-codes.xml file. This method is used when this registry is used in an application context. - *

Note that any existing translators will remain unless there is a match in the database name at which - * point the new translator will replace the existing one. - * - * @param sqlExceptionTranslators + * Setter for a Map of {@link SQLExceptionTranslator} references where the key must + * be the database name as defined in the sql-error-codes.xml file. + *

Note that any existing translators will remain unless there is a match in the + * database name, at which point the new translator will replace the existing one. */ - public void setSqlExceptionTranslators(Map sqlExceptionTranslators) { - this.sqlExceptionTranslators.putAll(sqlExceptionTranslators); + public void setTranslators(Map translators) { + this.translators.putAll(translators); } - public void afterPropertiesSet() throws Exception { - if (logger.isDebugEnabled()) { - logger.debug("Registering custom SQL exception translators for database(s): " + - sqlExceptionTranslators.keySet()); - } - for (String dbName : sqlExceptionTranslators.keySet()) { - CustomSQLExceptionTranslatorRegistry.getInstance() - .registerSqlExceptionTranslator(dbName, sqlExceptionTranslators.get(dbName)); + public void afterPropertiesSet() { + for (String dbName : this.translators.keySet()) { + CustomSQLExceptionTranslatorRegistry.getInstance().registerTranslator(dbName, this.translators.get(dbName)); } } + } diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java index 89db6b8902..ccbeb4d723 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java @@ -16,45 +16,25 @@ package org.springframework.jdbc.support; -import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.WeakHashMap; -import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; -import org.springframework.util.PatternMatchUtils; - /** * Registry for custom {@link org.springframework.jdbc.support.SQLExceptionTranslator} instances associated with * specific databases allowing for overriding translation based on values contained in the configuration file * named "sql-error-codes.xml". * * @author Thomas Risberg - * @since 3.1 + * @since 3.1.1 * @see SQLErrorCodesFactory */ public class CustomSQLExceptionTranslatorRegistry { private static final Log logger = LogFactory.getLog(CustomSQLExceptionTranslatorRegistry.class); - /** - * Map registry to hold custom translators specific databases. - * Key is the database product name as defined in the - * {@link org.springframework.jdbc.support.SQLErrorCodesFactory}. - */ - private final Map sqlExceptionTranslatorRegistry = - new HashMap(); - - /** * Keep track of a single instance so we can return it to classes that request it. */ @@ -70,7 +50,15 @@ public class CustomSQLExceptionTranslatorRegistry { /** - * Create a new instance of the {@link org.springframework.jdbc.support.CustomSQLExceptionTranslatorRegistry} class. + * Map registry to hold custom translators specific databases. + * Key is the database product name as defined in the + * {@link org.springframework.jdbc.support.SQLErrorCodesFactory}. + */ + private final Map translatorMap = new HashMap(); + + + /** + * Create a new instance of the {@link CustomSQLExceptionTranslatorRegistry} class. *

Not public to enforce Singleton design pattern. */ private CustomSQLExceptionTranslatorRegistry() { @@ -78,25 +66,28 @@ public class CustomSQLExceptionTranslatorRegistry { /** * Register a new custom translator for the specified database name. - * * @param dbName the database name - * @param sqlExceptionTranslator the custom translator + * @param translator the custom translator */ - public void registerSqlExceptionTranslator(String dbName, SQLExceptionTranslator sqlExceptionTranslator) { - SQLExceptionTranslator replaced = sqlExceptionTranslatorRegistry.put(dbName, sqlExceptionTranslator); + public void registerTranslator(String dbName, SQLExceptionTranslator translator) { + SQLExceptionTranslator replaced = translatorMap.put(dbName, translator); if (replaced != null) { - logger.warn("Replacing custom translator '" + replaced + - "' for database " + dbName + - " with '" + sqlExceptionTranslator + "'"); + logger.warn("Replacing custom translator [" + replaced + "] for database '" + dbName + + "' with [" + translator + "]"); } else { - logger.info("Adding custom translator '" + sqlExceptionTranslator.getClass().getSimpleName() + - "' for database " + dbName); + logger.info("Adding custom translator of type [" + translator.getClass().getName() + + "] for database '" + dbName + "'"); } } - public SQLExceptionTranslator findSqlExceptionTranslatorForDatabase(String dbName) { - return sqlExceptionTranslatorRegistry.get(dbName); + /** + * Find a custom translator for the specified database. + * @param dbName the database name + * @return the custom translator, or null if none found + */ + public SQLExceptionTranslator findTranslatorForDatabase(String dbName) { + return this.translatorMap.get(dbName); } } diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodes.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodes.java index 8dde372bec..c82bbad5bf 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodes.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodes.java @@ -17,7 +17,6 @@ package org.springframework.jdbc.support; import org.springframework.util.StringUtils; -import org.springframework.dao.InvalidDataAccessResourceUsageException; /** * JavaBean for holding JDBC error codes for a particular database. @@ -38,8 +37,6 @@ public class SQLErrorCodes { private boolean useSqlStateForTranslation = false; - private SQLExceptionTranslator customSqlExceptionTranslator = null; - private String[] badSqlGrammarCodes = new String[0]; private String[] invalidResultSetAccessCodes = new String[0]; @@ -62,6 +59,8 @@ public class SQLErrorCodes { private CustomSQLErrorCodesTranslation[] customTranslations; + private SQLExceptionTranslator customSqlExceptionTranslator; + /** * Set this property if the database name contains spaces, @@ -100,31 +99,6 @@ public class SQLErrorCodes { return this.useSqlStateForTranslation; } - public SQLExceptionTranslator getCustomSqlExceptionTranslator() { - return customSqlExceptionTranslator; - } - - public void setCustomSqlExceptionTranslator(SQLExceptionTranslator customSqlExceptionTranslator) { - this.customSqlExceptionTranslator = customSqlExceptionTranslator; - } - - public void setCustomSqlExceptionTranslatorClass(Class customSqlExceptionTranslatorClass) { - if (customSqlExceptionTranslatorClass != null) { - try { - this.customSqlExceptionTranslator = - (SQLExceptionTranslator) customSqlExceptionTranslatorClass.newInstance(); - } - catch (InstantiationException e) { - throw new InvalidDataAccessResourceUsageException( - "Unable to instantiate " + customSqlExceptionTranslatorClass.getName(), e); - } - catch (IllegalAccessException e) { - throw new InvalidDataAccessResourceUsageException( - "Unable to instantiate " + customSqlExceptionTranslatorClass.getName(), e); - } - } - } - public void setBadSqlGrammarCodes(String[] badSqlGrammarCodes) { this.badSqlGrammarCodes = StringUtils.sortStringArray(badSqlGrammarCodes); } @@ -213,4 +187,26 @@ public class SQLErrorCodes { return this.customTranslations; } + public void setCustomSqlExceptionTranslatorClass(Class customTranslatorClass) { + if (customTranslatorClass != null) { + try { + this.customSqlExceptionTranslator = customTranslatorClass.newInstance(); + } + catch (Exception ex) { + throw new IllegalStateException("Unable to instantiate custom translator", ex); + } + } + else { + this.customSqlExceptionTranslator = null; + } + } + + public void setCustomSqlExceptionTranslator(SQLExceptionTranslator customSqlExceptionTranslator) { + this.customSqlExceptionTranslator = customSqlExceptionTranslator; + } + + public SQLExceptionTranslator getCustomSqlExceptionTranslator() { + return this.customSqlExceptionTranslator; + } + } diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java index bdaf16c0e1..a127e82937 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java @@ -17,7 +17,6 @@ package org.springframework.jdbc.support; import java.util.Collections; -import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import javax.sql.DataSource; @@ -171,7 +170,7 @@ public class SQLErrorCodesFactory { } } if (sec != null) { - checkSqlExceptionTranslatorRegistry(dbName, sec); + checkCustomTranslatorRegistry(dbName, sec); if (logger.isDebugEnabled()) { logger.debug("SQL error codes for '" + dbName + "' found"); } @@ -248,10 +247,12 @@ public class SQLErrorCodesFactory { } } - private void checkSqlExceptionTranslatorRegistry(String dbName, SQLErrorCodes dbCodes) { - // Check the custom sql exception translator registry for any entries + /** + * Check the {@link CustomSQLExceptionTranslatorRegistry} for any entries. + */ + private void checkCustomTranslatorRegistry(String dbName, SQLErrorCodes dbCodes) { SQLExceptionTranslator customTranslator = - CustomSQLExceptionTranslatorRegistry.getInstance().findSqlExceptionTranslatorForDatabase(dbName); + CustomSQLExceptionTranslatorRegistry.getInstance().findTranslatorForDatabase(dbName); if (customTranslator != null) { if (dbCodes.getCustomSqlExceptionTranslator() != null) { logger.warn("Overriding already defined custom translator '" + @@ -265,7 +266,6 @@ public class SQLErrorCodesFactory { } dbCodes.setCustomSqlExceptionTranslator(customTranslator); } - } } diff --git a/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/support/test-custom-translators-context.xml b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/support/test-custom-translators-context.xml index df3a6258da..5603f4bd0a 100644 --- a/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/support/test-custom-translators-context.xml +++ b/org.springframework.jdbc/src/test/resources/org/springframework/jdbc/support/test-custom-translators-context.xml @@ -8,7 +8,7 @@ - +