package br.com.centralit.citcorpore.util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import br.com.centralit.citajax.util.CitAjaxUtil;
import br.com.citframework.integracao.ConnectionProvider;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.SQLConfig;
import br.com.citframework.util.UtilStrings;
/**
* @author fernando.gom
*/
public class AdaptacaoBD {
/**
* Arquivo de configura��o das adapta��es.
*/
private static Properties prop = null;
/**
* M�todo construtor.
*/
protected AdaptacaoBD() {}
/**
* @return adapta��es configuradas.
*/
private static Properties getProp() {
if (prop == null) {
prop = new Properties();
try {
InputStream inADPDB = null;
try {
inADPDB = AdaptacaoBD.class.getResourceAsStream("/WEB-INF/classes/AdaptacaoBancos.properties");
} catch (final Exception e) {}
if (inADPDB == null) {
try {
inADPDB = new FileInputStream(CitAjaxUtil.CAMINHO_REAL_APP + "/WEB-INF/classes/AdaptacaoBancos.properties");
} catch (final Exception e) {}
}
prop.load(inADPDB);
} catch (final Exception e) {
e.printStackTrace();
throw new Error("Arquivo de configura��o " + "'AdaptacaoBancos.properties' n�o encontrado.");
}
}
return prop;
}
/**
* @param ds
* - DataSource que cont�m os dados de conex�o.
* @return identificador do banco de dados obtido do DataSource.
*/
public static String getBancoUtilizado(final DataSource ds) {
if (ds != null) {
try (Connection conn = ds.getConnection();) {
return getBancoUtilizadoByDBProductName(conn.getMetaData().getDatabaseProductName());
} catch (final Exception e) {
e.printStackTrace();
System.out.println("CITSMART -> atencao: N�o � poss�vel obter a URL de conex�o do DataSource! Assumindo padr�o: ORACLE!");
return "oracle"; // retorna o padrao.
}
}
return "oracle"; // retorna o padrao.
}
public static String getBancoUtilizado() {
final String nomeDatabaseAlias = Constantes.getValue("DATABASE_ALIAS");
return getBancoUtilizado(nomeDatabaseAlias);
}
public static String getBancoUtilizado(final String nomeDatabaseAlias) {
try (Connection conn = ConnectionProvider.getConnection(nomeDatabaseAlias);) {
return getBancoUtilizadoByDBProductName(conn.getMetaData().getDatabaseProductName());
} catch (final Exception e) {
e.printStackTrace();
System.out.println("CITSMART -> atencao: N�o � poss�vel obter a URL de conex�o do DataSource! Assumindo padr�o: ORACLE!");
return "oracle"; // retorna o padrao.
}
}
public static String getBancoUtilizadoByDBProductName(final String databaseProductName) {
String db = databaseProductName.replaceAll(" ", "").toLowerCase();
if (db.indexOf("sqlserver") >= 0) {
db = "sqlserver";
} else if (db.indexOf("oracle") >= 0) {
db = "oracle";
} else if (db.indexOf("db2") >= 0) {
db = "db2";
} else if (db.indexOf("PostgreSQL".toLowerCase()) >= 0) {
db = "postgres";
} else if (db.indexOf("Derby".toLowerCase()) >= 0) {
db = "derby";
} else if (db.indexOf("mysql") >= 0) {
db = "mysql";
}
return db;
}
/**
* Retorna o comando SQL para obter a data.
*
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getDate() {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "date";
return getProp().getProperty(p);
}
/**
* Retorna o comando SQL para obter o timestamp.
*
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getTimestamp() {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "timestamp";
return getProp().getProperty(p);
}
/**
* Retorna o comando SQL para obter a hora.
*
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getTime() {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "time";
return getProp().getProperty(p);
}
/**
* Retorna o comando SQL para obter o dia de uma data.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getDay(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "day";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
public static String getUpperFunction(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "upper";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
if (CITCorporeUtil.SGBD_PRINCIPAL.toUpperCase().equals(SQLConfig.SQLSERVER)) {
adap = "upper(" + sourceData + ")";
}
return adap;
}
/**
* Retorna o comando SQL para obter o dia da semana de uma data.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getDayOfWeek(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "dayofweek";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Retorna o comando SQL para obter o n�mero do m�s de uma data.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getMonth(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "month";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Retorna o comando SQL para obter o ano de uma data.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getYear(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "year";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Retorna o comando SQL para setar o formato padr�o de datas.
*
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getSetDateFormat() {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "setdateformat";
return getProp().getProperty(p);
}
/**
* Retorna o comando SQL para convers�o de algum campo para varchar.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getCastToChar(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "casttochar";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Retorna o comando SQL para convers�o de campos CLOB's em varchar.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou a pr�pria data a ser convertida.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getClobToVarchar(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "clobtovarchar";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Ajusta o SQL para retornar apenas a quantidade de registros desejada.
*
* @param select
* - script SQL que ser� ajustado.
* @param qtd
* - quantidade de linhas que ser�o retornadas.
* @param orderBy
* - condi��o ORDER BY para ajuste do SQL. N�o � obrigat�rio.
* @return SQL ajustada.
*/
public static String getFetchFirst(final String select, final Integer qtd, final String orderBy) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "fetchfirst";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("[{][0][0][}]", qtd.toString());
adap = adap.replaceAll("[{][0][1][}]", select);
adap = adap.replaceAll("[{][0][2][}]", orderBy);
}
return adap;
}
/**
* Retorna o comando SQL para obter as horas e minutos a partir de um campo que armazena data e hora. O formato retornado � <i>HH:mm</i>.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou o pr�prio timestamp a ser convertido.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getConvertDatetimeToHHMMChar(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "convertdatetimetohhmmchar";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
/**
* Retorna o comando SQL para obter a data a partir de um campo que armazena data e hora. O formato retornado � <i>DD/MM/YYYY</i>.
*
* @param sourceData
* - Fonte da informa��o a ser convertida. Pode ser o nome de um campo ou o pr�prio timestamp a ser convertido.
* @return adapta��o referente ao banco de dados acessado pelo DataSource.
*/
public static String getConvertDateToDDMMYYYYChar(final String sourceData) {
String p = CITCorporeUtil.SGBD_PRINCIPAL;
if (p != null && !p.equalsIgnoreCase("")) {
p += ".";
}
p += "convertdatetoddmmyyyychar";
String adap = getProp().getProperty(p);
if (UtilStrings.isNotVazio(adap)) {
adap = adap.replaceAll("x", sourceData);
}
return adap;
}
}