package br.com.citframework.integracao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import javax.resource.ResourceException; import javax.sql.DataSource; import org.apache.commons.lang.StringUtils; import br.com.centralit.citcorpore.util.AdaptacaoBD; import br.com.citframework.util.Constantes; import br.com.citframework.util.JNDIFactory; /** * * @author Ney Pellegrini * */ public final class ConnectionProvider { private static final Logger LOGGER = Logger.getLogger(ConnectionProvider.class.getName()); private static final String POSTGRESQL = "POSTGRES"; private static final String SQLSERVER = "SQLSERVER"; private ConnectionProvider() {} /** * Recupera uma conex�o publicada como recurso na JNDI ou recuperando configura��es de usu�rio, url, etc. do arquivo {@code Constantes.properties} * * @param jndiName * nome do recurso JNDI a ser recuperado, caso seja JNDI * * @return {@link Connection} * @throws Exception * @see ConnectionProvider#getConnection(String, Boolean) */ // TODO refatorar para usar os m�todos corretamente, isso aqui n�o faz sentido quando n�o � JNDI public static Connection getConnection(final String jndiName) throws Exception { Connection con = null; try { // Verifica de que maneira a Conex�o ser� recuperada final String recuperacao = Constantes.getValue("OBTECAO_CONEXAO", "JNDI").trim(); if (recuperacao.equalsIgnoreCase("JDBC")) { final String usuario = Constantes.getValue("USUARIO_CONEXAO"); final String senha = Constantes.getValue("SENHA_CONEXAO"); final String classe = Constantes.getValue("CLASSE_CONEXAO"); final String url = Constantes.getValue("URL_CONEXAO"); con = getConnection(classe, url, usuario, senha); } else { if (StringUtils.isBlank(jndiName)) { throw new IllegalArgumentException("Resource JNDI n�o deve ser vazio ou nulo"); } con = getConnectionFromJNDI(jndiName); } setTransactionIsolation(con); } catch (final Exception e) { final String mensagem = String.format("Problema ao recuperar conex�o tipo=%s: ", jndiName) + e.getMessage(); LOGGER.log(Level.WARNING, mensagem, e); throw new Exception(mensagem, e); } return con; } /** * Recupera uma conex�o publicada como recurso na JNDI ou recuperando configura��es de usu�rio, url, etc. do arquivo {@code Constantes.properties}, setando explicitamente se a * conex�o � ou n�o apenas leitura * * @param jndiName * nome do recurso JNDI a ser recuperado, caso seja JNDI * @param readOnly * se a conex�o deve ser ou n�o apenas leitura * @return {@link Connection} * @throws Exception * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 19/08/2014 * @see ConnectionProvider#getConnection(String) */ // TODO refatorar para usar os m�todos corretamente, isso aqui n�o faz sentido quando n�o � JNDI public static Connection getConnection(final String jndiName, final Boolean readOnly) throws Exception { final Connection connection = getConnection(jndiName); try { connection.setReadOnly(readOnly); } catch (final SQLException e) { final String mensagem = "Problema ao setar conex�o como read only: " + e.getMessage(); LOGGER.log(Level.WARNING, mensagem, e); throw new Exception(mensagem, e); } return connection; } /** * Recupera uma conex�o de acordo com oas par�metros informados * * @param clazz * classe do driver para conex�o * @param url * url de conex�o * @param user * uus�ri para conex�o * @param password * senha do usu�rio para conex�o * @return {@link Connection} * @throws Exception * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 19/08/2014 * @see ConnectionProvider#getConnection(String, String, String, String, Boolean) */ public static Connection getConnection(final String clazz, final String url, final String user, final String password) throws Exception { if (StringUtils.isBlank(user)) { throw new IllegalArgumentException("A constante USUARIO_CONEXAO deve ser preenchida corretamente"); } if (StringUtils.isBlank(password)) { throw new IllegalArgumentException("A constante SENHA_CONEXAO deve ser preenchida corretamente"); } if (StringUtils.isBlank(clazz)) { throw new IllegalArgumentException("A constante CLASSE_CONEXAO deve ser preenchida corretamente"); } if (StringUtils.isBlank(url)) { throw new IllegalArgumentException("A constante URL_CONEXAO deve ser preenchida corretamente"); } Class.forName(clazz); return DriverManager.getConnection(url, user, password); } /** * Recupera uma conex�o de acordo com oas par�metros informados * * @param clazz * classe do driver para conex�o * @param url * url de conex�o * @param user * usu�rio para conex�o * @param password * senha do usu�rio para conex�o * @param readOnly * se a conex�o deve ser ou n�o apenas leitura * @return {@link Connection} * @throws Exception * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 19/08/2014 * @see ConnectionProvider#getConnection(String, String, String, String) */ public static Connection getConnection(final String clazz, final String url, final String user, final String password, final Boolean readOnly) throws Exception { final Connection connection = getConnection(clazz, url, user, password); try { connection.setReadOnly(readOnly); } catch (final SQLException e) { final String mensagem = "Problema ao setar conex�o como read only: " + e.getMessage(); LOGGER.log(Level.WARNING, mensagem, e); throw new Exception(mensagem, e); } return connection; } private static final JNDIFactory jndiContext = new JNDIFactory(); /** * Recupera inst�ncia de {@link Connection} de um recurso JNDI * * @param jndiName * nome do recurso publicado na JNDI * @return {@link Connection} * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @throws Exception * @since 19/08/2014 * @see ConnectionProvider#getConnectionFromJNDI(String, Boolean) */ public static Connection getConnectionFromJNDI(final String jndiName) throws Exception { Connection connection = null; try { connection = ((DataSource) jndiContext.getResource(jndiName)).getConnection(); } catch (final ResourceException e) { final String mensagem = "Problema ao recuperar conex�o da JNDI: " + e.getMessage(); LOGGER.log(Level.SEVERE, mensagem, e); throw new Exception(mensagem, e); } return connection; } /** * Recupera inst�ncia de {@link Connection} de um recurso JNDI * * @param jndiName * nome do recurso publicado na JNDI * @param se * a conex�o deve ser ou n�o apenas leitura * @return {@link Connection} * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @throws Exception * caso ocorra algum problema ao informar o {@code readOnly} * @since 19/08/2014 * @see ConnectionProvider#getConnectionFromJNDI(String) */ public static Connection getConnectionFromJNDI(final String jndiName, final Boolean readOnly) throws Exception { final Connection connection = getConnectionFromJNDI(jndiName); try { connection.setReadOnly(readOnly); } catch (final SQLException e) { final String mensagem = "Problema ao setar conex�o como read only: " + e.getMessage(); LOGGER.log(Level.WARNING, mensagem, e); throw new Exception(mensagem, e); } return connection; } private static void setTransactionIsolation(final Connection con) throws SQLException { final String strSGBDPrincipal = AdaptacaoBD.getBancoUtilizadoByDBProductName(con.getMetaData().getDatabaseProductName()); if (!strSGBDPrincipal.equalsIgnoreCase(POSTGRESQL)) { if (strSGBDPrincipal.equalsIgnoreCase(SQLSERVER)) { con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); } else { con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); } } } }