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 13 import javax.inject.Inject;
14 14 import javax.naming.Context;
15 15 import javax.naming.InitialContext;
  16 +import javax.naming.NamingException;
16 17 import javax.sql.DataSource;
17 18  
18 19 import org.slf4j.Logger;
... ... @@ -108,22 +109,33 @@ public class DataSourceProducer implements Serializable {
108 109 private DataSource initDataSource(String dataSourceName) {
109 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 141 return result;
... ...
impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/BasicDataSourceProxy.java
... ... @@ -8,35 +8,46 @@ import java.util.Collection;
8 8  
9 9 import org.apache.commons.dbcp.BasicDataSource;
10 10  
  11 +import br.gov.frameworkdemoiselle.DemoiselleException;
11 12 import br.gov.frameworkdemoiselle.internal.configuration.JDBCConfig;
  13 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
12 14  
13 15 public class BasicDataSourceProxy extends BasicDataSource implements Serializable {
14 16  
15 17 private static final long serialVersionUID = 1L;
16 18  
  19 + private ResourceBundle bundle;
  20 +
17 21 private String dataSourceName;
18 22  
19 23 private JDBCConfig config;
20 24  
21 25 private transient BasicDataSource delegate;
22 26  
23   - public BasicDataSourceProxy(String dataSourceName, JDBCConfig config) {
  27 + public BasicDataSourceProxy(String dataSourceName, JDBCConfig config, ResourceBundle bundle) {
24 28 this.dataSourceName = dataSourceName;
25 29 this.config = config;
  30 + this.bundle = bundle;
26 31 }
27 32  
28 33 private BasicDataSource getDelegate() {
29 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 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 52 delegate = dataSource;
42 53 }
... ...
impl/extension/jdbc/src/main/resources/demoiselle-jdbc-bundle.properties
... ... @@ -34,9 +34,10 @@
34 34 # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
35 35  
36 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 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 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 41 datasource-not-found-in-cache=DataSource n\u00E3o encontrado para contexto atual, criando um agora.
41 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.
... ...