package br.com.centralit.citcorpore.metainfo.util;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import br.com.centralit.citcorpore.bean.DataManagerFKRelatedDTO;
import br.com.centralit.citcorpore.metainfo.bean.CamposObjetoNegocioDTO;
import br.com.centralit.citcorpore.metainfo.bean.ObjetoNegocioDTO;
import br.com.centralit.citcorpore.metainfo.integracao.VisaoDao;
import br.com.centralit.citcorpore.metainfo.negocio.ObjetoNegocioService;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.SQLConfig;
@SuppressWarnings({"rawtypes", "unchecked"})
public class DataBaseMetaDadosUtil {
public String sincronizaObjNegDB(final String nomeTabela, final boolean messages) throws ServiceException, Exception {
final VisaoDao visaoDao = new VisaoDao();
final Connection con = visaoDao.getTransactionControler().getConnection();
String DB_SCHEMA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.DB_SCHEMA, "");
if (CITCorporeUtil.SGBD_PRINCIPAL.equalsIgnoreCase(SQLConfig.SQLSERVER)) {
DB_SCHEMA = null;
} else if (DB_SCHEMA == null || DB_SCHEMA.trim().equalsIgnoreCase("")) {
DB_SCHEMA = "citsmart";
}
final Collection colObsNegocio = this.readTables(con, DB_SCHEMA, DB_SCHEMA, nomeTabela, messages);
con.close();
String carregados = "";
final ObjetoNegocioService objetoNegocioService = (ObjetoNegocioService) ServiceLocator.getInstance().getService(ObjetoNegocioService.class, null);
for (final Iterator it = colObsNegocio.iterator(); it.hasNext();) {
final ObjetoNegocioDTO objetoNegocioDTO = (ObjetoNegocioDTO) it.next();
if (messages) {
System.out.println("-----: Objeto de Negocio: " + objetoNegocioDTO.getNomeTabelaDB());
}
carregados += objetoNegocioDTO.getNomeTabelaDB() + ",";
final Collection colObjs = objetoNegocioService.findByNomeTabelaDB(objetoNegocioDTO.getNomeTabelaDB());
if (colObjs == null || colObjs.size() == 0) {
if (messages) {
System.out.println("----------: Criando.... " + objetoNegocioDTO.getNomeTabelaDB());
}
objetoNegocioService.create(objetoNegocioDTO);
} else {
final ObjetoNegocioDTO objetoNegocioAux = (ObjetoNegocioDTO) ((List) colObjs).get(0);
objetoNegocioDTO.setIdObjetoNegocio(objetoNegocioAux.getIdObjetoNegocio());
if (messages) {
System.out.println("----------: Atualizando.... " + objetoNegocioDTO.getNomeTabelaDB() + " Id Interno: " + objetoNegocioAux.getIdObjetoNegocio());
}
objetoNegocioService.update(objetoNegocioDTO);
}
}
return carregados;
}
public Collection readTables(final Connection con, final String catalogo, final String esquema, final String tableName, final boolean messages) throws SQLException {
final DatabaseMetaData dm = con.getMetaData();
final String[] types = {"TABLE"};
final ResultSet rsTables = dm.getTables(catalogo, esquema, null, types);
final Collection colObjetosNegocio = new ArrayList();
while (rsTables.next()) {
final ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();
final String cat = rsTables.getString("TABLE_CAT");
final String schema = rsTables.getString("TABLE_SCHEM");
final String nomeTabela = rsTables.getString("TABLE_NAME");
final String nomeTabelaAux = nomeTabela.toUpperCase();
objetoNegocioDTO.setNomeTabelaDB(nomeTabelaAux);
objetoNegocioDTO.setNomeObjetoNegocio(nomeTabelaAux);
objetoNegocioDTO.setSituacao("A");
if (tableName != null && !tableName.trim().equalsIgnoreCase("")) {
if (!tableName.toUpperCase().equalsIgnoreCase(nomeTabelaAux)) {
continue;
}
}
if (messages) {
System.out.println(" ------::::::::::::::::> TABELA: " + nomeTabelaAux);
}
final ResultSet rsPKs = dm.getPrimaryKeys(cat, schema, nomeTabela);
final ArrayList listaPKs = new ArrayList();
while (rsPKs.next()) {
final String nomeColuna = rsPKs.getString("COLUMN_NAME");
listaPKs.add(nomeColuna);
}
rsPKs.close();
final ResultSet rsFKs = dm.getImportedKeys(cat, schema, nomeTabela);
while (rsFKs.next()) {
final String nomeTabelaPK = rsFKs.getString("PKTABLE_NAME");
final String nomeColunaPK = rsFKs.getString("PKCOLUMN_NAME");
final String nomeTabelaFK = rsFKs.getString("FKTABLE_NAME");
final String nomeColunaFK = rsFKs.getString("FKCOLUMN_NAME");
final String campoFK = schema + "." + nomeTabelaFK + "." + nomeColunaFK;
final String campoPK = schema + "." + nomeTabelaPK + "." + nomeColunaPK;
final String join = "(and " + campoFK + " = " + campoPK + ")";
if (messages) {
System.out.println(" join = " + join);
}
}
rsFKs.close();
ResultSet rsColunas = null;
try {
rsColunas = dm.getColumns(cat, schema, nomeTabela, null);
} catch (final Exception e) {
System.out.println("Problemas ao ler campos da tabela: " + nomeTabela + " --> " + e.getMessage());
}
if (rsColunas == null) {
continue;
}
final Collection colCampos = new ArrayList();
while (rsColunas.next()) {
final CamposObjetoNegocioDTO camposObjetoNegocioDTO = new CamposObjetoNegocioDTO();
String nomeColunaBanco = rsColunas.getString("COLUMN_NAME");
String nomeTipo = rsColunas.getString("TYPE_NAME");
final int precisionDB = rsColunas.getInt("DECIMAL_DIGITS");
final String isNullable = rsColunas.getString("IS_NULLABLE");
final String seColunaPK = listaPKs.contains(nomeColunaBanco) ? "S" : "N";
String seObrigatorio = null;
if (isNullable != null && isNullable.trim().length() > 0) {
seObrigatorio = isNullable.trim().indexOf("YES") > -1 ? "N" : "S";
}
if (messages) {
System.out.println(" ------:::::::::::::::::::::::::::::::::::> COLUNA: " + nomeColunaBanco + " Tipo: " + nomeTipo + " PK: " + seColunaPK + " OBR: "
+ seObrigatorio);
}
if (nomeTipo == null) {
nomeTipo = "";
}
nomeTipo = nomeTipo.toUpperCase();
nomeColunaBanco = nomeColunaBanco.toUpperCase();
camposObjetoNegocioDTO.setNomeDB(nomeColunaBanco);
camposObjetoNegocioDTO.setNome(nomeColunaBanco);
camposObjetoNegocioDTO.setPk(seColunaPK);
camposObjetoNegocioDTO.setSequence(seColunaPK);
camposObjetoNegocioDTO.setUnico(seColunaPK);
camposObjetoNegocioDTO.setObrigatorio(seObrigatorio);
camposObjetoNegocioDTO.setTipoDB(nomeTipo);
camposObjetoNegocioDTO.setPrecisionDB(precisionDB);
camposObjetoNegocioDTO.setSituacao("A");
colCampos.add(camposObjetoNegocioDTO);
}
rsColunas.close();
objetoNegocioDTO.setColCampos(colCampos);
colObjetosNegocio.add(objetoNegocioDTO);
}
rsTables.close();
return colObjetosNegocio;
}
public String getTabelaPaiByTableAndField(final String tableName, final String field, final boolean messages) throws Exception {
final VisaoDao visaoDao = new VisaoDao();
final Connection con = visaoDao.getTransactionControler().getConnection();
String DB_SCHEMA = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.DB_SCHEMA, "");
if (CITCorporeUtil.SGBD_PRINCIPAL.equalsIgnoreCase(SQLConfig.SQLSERVER)) {
DB_SCHEMA = null;
} else if (DB_SCHEMA == null || DB_SCHEMA.trim().equalsIgnoreCase("")) {
DB_SCHEMA = "citsmart";
}
final DatabaseMetaData dm = con.getMetaData();
final String[] types = {"TABLE"};
String retorno = "";
final ResultSet rsTables = dm.getTables(DB_SCHEMA, DB_SCHEMA, null, types);
while (rsTables.next()) {
final ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();
final String cat = rsTables.getString("TABLE_CAT");
final String schema = rsTables.getString("TABLE_SCHEM");
final String nomeTabela = rsTables.getString("TABLE_NAME");
final String nomeTabelaAux = nomeTabela.toUpperCase();
objetoNegocioDTO.setNomeTabelaDB(nomeTabelaAux);
objetoNegocioDTO.setNomeObjetoNegocio(nomeTabelaAux);
objetoNegocioDTO.setSituacao("A");
if (tableName != null && !tableName.trim().equalsIgnoreCase("")) {
if (!tableName.toUpperCase().equalsIgnoreCase(nomeTabelaAux)) {
continue;
}
}
final ResultSet rsFKs = dm.getImportedKeys(cat, schema, nomeTabela);
while (rsFKs.next()) {
final String nomeTabelaPK = rsFKs.getString("PKTABLE_NAME");
final String nomeColunaPK = rsFKs.getString("PKCOLUMN_NAME");
if (field.equalsIgnoreCase(nomeColunaPK)) {
retorno = nomeTabelaPK;
break;
}
}
rsFKs.close();
break;
}
rsTables.close();
con.close();
return retorno;
}
public Collection readFK(final Connection con, final String catalogo, final String esquema, final String tableName) throws SQLException {
final DatabaseMetaData dm = con.getMetaData();
final String[] types = {"TABLE"};
final ResultSet rsTables = dm.getTables(catalogo, esquema, null, types);
final Collection colRetorno = new ArrayList();
while (rsTables.next()) {
final ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();
final String cat = rsTables.getString("TABLE_CAT");
final String schema = rsTables.getString("TABLE_SCHEM");
final String nomeTabela = rsTables.getString("TABLE_NAME");
final String nomeTabelaAux = nomeTabela.toUpperCase();
objetoNegocioDTO.setNomeTabelaDB(nomeTabelaAux);
objetoNegocioDTO.setNomeObjetoNegocio(nomeTabelaAux);
objetoNegocioDTO.setSituacao("A");
if (tableName != null && !tableName.trim().equalsIgnoreCase("")) {
if (!tableName.toUpperCase().equalsIgnoreCase(nomeTabelaAux)) {
continue;
}
}
System.out.println(" ------::::::::::::::::> TABELA: " + nomeTabelaAux);
final ResultSet rsPKs = dm.getPrimaryKeys(cat, schema, nomeTabela);
final ArrayList listaPKs = new ArrayList();
while (rsPKs.next()) {
final String nomeColuna = rsPKs.getString("COLUMN_NAME");
listaPKs.add(nomeColuna);
}
rsPKs.close();
final ResultSet rsFKs = dm.getExportedKeys(cat, schema, nomeTabela);
while (rsFKs.next()) {
final DataManagerFKRelatedDTO dataManagerFKRelatedDTO = new DataManagerFKRelatedDTO();
final String nomeTabelaPK = rsFKs.getString("PKTABLE_NAME");
final String nomeColunaPK = rsFKs.getString("PKCOLUMN_NAME");
final String nomeTabelaFK = rsFKs.getString("FKTABLE_NAME");
final String nomeColunaFK = rsFKs.getString("FKCOLUMN_NAME");
final String campoFK = nomeTabelaFK + "." + nomeColunaFK;
final String campoPK = nomeTabelaPK + "." + nomeColunaPK;
final String join = " " + campoFK + " = " + campoPK + " ";
dataManagerFKRelatedDTO.setJoin(join);
dataManagerFKRelatedDTO.setNomeTabelaRelacionada(nomeTabelaFK);
dataManagerFKRelatedDTO.setPartChild(campoFK);
dataManagerFKRelatedDTO.setPartParent(campoPK);
System.out.println(" join = " + join);
colRetorno.add(dataManagerFKRelatedDTO);
}
rsFKs.close();
}
rsTables.close();
return colRetorno;
}
}