From 56acf0b5b52560607c7eedeb109f76da2a09638b Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Fri, 8 Feb 2013 15:36:19 -0300 Subject: [PATCH] Blindando a extensão contra possíveis falhas na configuração provocadas pelo usuário --- impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DataSourceProducer.java | 36 ++++++++++++++++++++++++------------ impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java | 31 +++++++++++++++++++++---------- impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties | 5 +++-- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DataSourceProducer.java b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DataSourceProducer.java index 4d02ee2..b5228fb 100644 --- a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DataSourceProducer.java +++ b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/DataSourceProducer.java @@ -13,6 +13,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.naming.Context; import javax.naming.InitialContext; +import javax.naming.NamingException; import javax.sql.DataSource; import org.slf4j.Logger; @@ -108,22 +109,33 @@ public class DataSourceProducer implements Serializable { private DataSource initDataSource(String dataSourceName) { DataSource result; - try { - JDBCConfig config = Beans.getReference(JDBCConfig.class); - Map jndiMap = config.getJndiName(); + JDBCConfig config = Beans.getReference(JDBCConfig.class); + Map jndiMap = config.getJndiName(); - if (jndiMap != null) { - Context context = new InitialContext(); - result = (DataSource) context.lookup(jndiMap.get(dataSourceName)); + if (jndiMap != null) { + result = initJNDIDataSource(dataSourceName, config); - } else { - result = new BasicDataSourceProxy(dataSourceName, config); - } + } else { + result = new BasicDataSourceProxy(dataSourceName, config, bundle); + } + + return result; + } + + private DataSource initJNDIDataSource(String dataSourceName, JDBCConfig config) { + DataSource result = null; + + try { + Context context = new InitialContext(); + String jndi = config.getJndiName().get(dataSourceName); + + result = (DataSource) context.lookup(jndi); - } catch (Exception cause) { - // TODO Colocar uma mensagem amigável + } catch (NamingException cause) { + throw new DemoiselleException(bundle.getString("load-jndi-datasource-failed", dataSourceName), cause); - throw new DemoiselleException("", cause); + } catch (ClassCastException cause) { + throw new DemoiselleException(bundle.getString("load-duplicated-configuration-failed"), cause); } return result; diff --git a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java index 706b1b0..3bf63db 100644 --- a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java +++ b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java @@ -8,35 +8,46 @@ import java.util.Collection; import org.apache.commons.dbcp.BasicDataSource; +import br.gov.frameworkdemoiselle.DemoiselleException; import br.gov.frameworkdemoiselle.internal.configuration.JDBCConfig; +import br.gov.frameworkdemoiselle.util.ResourceBundle; public class BasicDataSourceProxy extends BasicDataSource implements Serializable { private static final long serialVersionUID = 1L; + private ResourceBundle bundle; + private String dataSourceName; private JDBCConfig config; private transient BasicDataSource delegate; - public BasicDataSourceProxy(String dataSourceName, JDBCConfig config) { + public BasicDataSourceProxy(String dataSourceName, JDBCConfig config, ResourceBundle bundle) { this.dataSourceName = dataSourceName; this.config = config; + this.bundle = bundle; } private BasicDataSource getDelegate() { if (this.delegate == null) { - String driver = config.getDriverClass().get(dataSourceName); - String url = config.getUrl().get(dataSourceName); - String username = config.getUsername().get(dataSourceName); - String password = config.getPassword().get(dataSourceName); - BasicDataSource dataSource = new BasicDataSource(); - dataSource.setDriverClassName(driver); - dataSource.setUrl(url); - dataSource.setUsername(username); - dataSource.setPassword(password); + + try { + String driver = config.getDriverClass().get(dataSourceName); + String url = config.getUrl().get(dataSourceName); + String username = config.getUsername().get(dataSourceName); + String password = config.getPassword().get(dataSourceName); + + dataSource.setDriverClassName(driver); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + + } catch (ClassCastException cause) { + throw new DemoiselleException(bundle.getString("load-duplicated-configuration-failed"), cause); + } delegate = dataSource; } diff --git a/impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties b/impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties index bb91a36..365e519 100644 --- a/impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties +++ b/impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties @@ -34,9 +34,10 @@ # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. more-than-one-datasource-defined=Existe mais de um banco de dados definido. Utilize @{0} no ponto de inje\u00E7\u00E3o ou defina o atributo "frameworkdemoiselle.persistence.default.datasource.name" no arquivo demoiselle.properties. +load-jndi-datasource-failed=Falha ao tentar obter a conex\u00E3o "{0}" via JNDI. +load-duplicated-configuration-failed=Falha no carregamento das configura\u00E7\u00F5es JDBC. Verifique se existem valores duplicados indevidamente no demoiselle.properties. getting-default-datasource-name-from-properties=Obtendo a configura\u00E7\u00E3o de banco de dados padr\u00E3o "{0}" a partir do arquivo de configura\u00E7\u00E3o demoiselle.properties. datasource-name-found=Configura\u00E7\u00E3o de banco de dados "{0}" encontrada. -persistence-unit-name-found=Configura\u00E7\u00E3o do banco de dados "{0}" encontrada. datasource-not-found-in-cache=DataSource n\u00E3o encontrado para contexto atual, criando um agora. connection-was-created=Conex\u00E3o criada a partir da configura\u00E7\u00E3o "{0}". -datasource-name-not-found=Nenhuma configura\u00E7\u00E3o de banco de dados foi encontrada no "demoiselle.properties" +datasource-name-not-found=Nenhuma configura\u00E7\u00E3o de banco de dados foi encontrada no demoiselle.properties. -- libgit2 0.21.2