Commit 56acf0b5b52560607c7eedeb109f76da2a09638b
1 parent
b7462d89
Exists in
master
Blindando a extensão contra possíveis falhas na configuração provocadas
pelo usuário
Showing
3 changed files
with
48 additions
and
24 deletions
Show diff stats
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. |