Commit 56acf0b5b52560607c7eedeb109f76da2a09638b

Authored by Cleverson Sacramento
1 parent b7462d89
Exists in master

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
@@ -13,6 +13,7 @@ import javax.enterprise.context.ApplicationScoped; @@ -13,6 +13,7 @@ import javax.enterprise.context.ApplicationScoped;
13 import javax.inject.Inject; 13 import javax.inject.Inject;
14 import javax.naming.Context; 14 import javax.naming.Context;
15 import javax.naming.InitialContext; 15 import javax.naming.InitialContext;
  16 +import javax.naming.NamingException;
16 import javax.sql.DataSource; 17 import javax.sql.DataSource;
17 18
18 import org.slf4j.Logger; 19 import org.slf4j.Logger;
@@ -108,22 +109,33 @@ public class DataSourceProducer implements Serializable { @@ -108,22 +109,33 @@ public class DataSourceProducer implements Serializable {
108 private DataSource initDataSource(String dataSourceName) { 109 private DataSource initDataSource(String dataSourceName) {
109 DataSource result; 110 DataSource result;
110 111
111 - try {  
112 - JDBCConfig config = Beans.getReference(JDBCConfig.class);  
113 - Map<String, String> jndiMap = config.getJndiName(); 112 + JDBCConfig config = Beans.getReference(JDBCConfig.class);
  113 + Map<String, String> jndiMap = config.getJndiName();
114 114
115 - if (jndiMap != null) {  
116 - Context context = new InitialContext();  
117 - result = (DataSource) context.lookup(jndiMap.get(dataSourceName)); 115 + if (jndiMap != null) {
  116 + result = initJNDIDataSource(dataSourceName, config);
118 117
119 - } else {  
120 - result = new BasicDataSourceProxy(dataSourceName, config);  
121 - } 118 + } else {
  119 + result = new BasicDataSourceProxy(dataSourceName, config, bundle);
  120 + }
  121 +
  122 + return result;
  123 + }
  124 +
  125 + private DataSource initJNDIDataSource(String dataSourceName, JDBCConfig config) {
  126 + DataSource result = null;
  127 +
  128 + try {
  129 + Context context = new InitialContext();
  130 + String jndi = config.getJndiName().get(dataSourceName);
  131 +
  132 + result = (DataSource) context.lookup(jndi);
122 133
123 - } catch (Exception cause) {  
124 - // TODO Colocar uma mensagem amigável 134 + } catch (NamingException cause) {
  135 + throw new DemoiselleException(bundle.getString("load-jndi-datasource-failed", dataSourceName), cause);
125 136
126 - throw new DemoiselleException("", cause); 137 + } catch (ClassCastException cause) {
  138 + throw new DemoiselleException(bundle.getString("load-duplicated-configuration-failed"), cause);
127 } 139 }
128 140
129 return result; 141 return result;
impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java
@@ -8,35 +8,46 @@ import java.util.Collection; @@ -8,35 +8,46 @@ import java.util.Collection;
8 8
9 import org.apache.commons.dbcp.BasicDataSource; 9 import org.apache.commons.dbcp.BasicDataSource;
10 10
  11 +import br.gov.frameworkdemoiselle.DemoiselleException;
11 import br.gov.frameworkdemoiselle.internal.configuration.JDBCConfig; 12 import br.gov.frameworkdemoiselle.internal.configuration.JDBCConfig;
  13 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
12 14
13 public class BasicDataSourceProxy extends BasicDataSource implements Serializable { 15 public class BasicDataSourceProxy extends BasicDataSource implements Serializable {
14 16
15 private static final long serialVersionUID = 1L; 17 private static final long serialVersionUID = 1L;
16 18
  19 + private ResourceBundle bundle;
  20 +
17 private String dataSourceName; 21 private String dataSourceName;
18 22
19 private JDBCConfig config; 23 private JDBCConfig config;
20 24
21 private transient BasicDataSource delegate; 25 private transient BasicDataSource delegate;
22 26
23 - public BasicDataSourceProxy(String dataSourceName, JDBCConfig config) { 27 + public BasicDataSourceProxy(String dataSourceName, JDBCConfig config, ResourceBundle bundle) {
24 this.dataSourceName = dataSourceName; 28 this.dataSourceName = dataSourceName;
25 this.config = config; 29 this.config = config;
  30 + this.bundle = bundle;
26 } 31 }
27 32
28 private BasicDataSource getDelegate() { 33 private BasicDataSource getDelegate() {
29 if (this.delegate == null) { 34 if (this.delegate == null) {
30 - String driver = config.getDriverClass().get(dataSourceName);  
31 - String url = config.getUrl().get(dataSourceName);  
32 - String username = config.getUsername().get(dataSourceName);  
33 - String password = config.getPassword().get(dataSourceName);  
34 -  
35 BasicDataSource dataSource = new BasicDataSource(); 35 BasicDataSource dataSource = new BasicDataSource();
36 - dataSource.setDriverClassName(driver);  
37 - dataSource.setUrl(url);  
38 - dataSource.setUsername(username);  
39 - dataSource.setPassword(password); 36 +
  37 + try {
  38 + String driver = config.getDriverClass().get(dataSourceName);
  39 + String url = config.getUrl().get(dataSourceName);
  40 + String username = config.getUsername().get(dataSourceName);
  41 + String password = config.getPassword().get(dataSourceName);
  42 +
  43 + dataSource.setDriverClassName(driver);
  44 + dataSource.setUrl(url);
  45 + dataSource.setUsername(username);
  46 + dataSource.setPassword(password);
  47 +
  48 + } catch (ClassCastException cause) {
  49 + throw new DemoiselleException(bundle.getString("load-duplicated-configuration-failed"), cause);
  50 + }
40 51
41 delegate = dataSource; 52 delegate = dataSource;
42 } 53 }
impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties
@@ -34,9 +34,10 @@ @@ -34,9 +34,10 @@
34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35
36 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. 36 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.
  37 +load-jndi-datasource-failed=Falha ao tentar obter a conex\u00E3o "{0}" via JNDI.
  38 +load-duplicated-configuration-failed=Falha no carregamento das configura\u00E7\u00F5es JDBC. Verifique se existem valores duplicados indevidamente no demoiselle.properties.
37 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. 39 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.
38 datasource-name-found=Configura\u00E7\u00E3o de banco de dados "{0}" encontrada. 40 datasource-name-found=Configura\u00E7\u00E3o de banco de dados "{0}" encontrada.
39 -persistence-unit-name-found=Configura\u00E7\u00E3o do banco de dados "{0}" encontrada.  
40 datasource-not-found-in-cache=DataSource n\u00E3o encontrado para contexto atual, criando um agora. 41 datasource-not-found-in-cache=DataSource n\u00E3o encontrado para contexto atual, criando um agora.
41 connection-was-created=Conex\u00E3o criada a partir da configura\u00E7\u00E3o "{0}". 42 connection-was-created=Conex\u00E3o criada a partir da configura\u00E7\u00E3o "{0}".
42 -datasource-name-not-found=Nenhuma configura\u00E7\u00E3o de banco de dados foi encontrada no "demoiselle.properties" 43 +datasource-name-not-found=Nenhuma configura\u00E7\u00E3o de banco de dados foi encontrada no demoiselle.properties.