package br.com.centralit.citcorpore.negocio; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import br.com.centralit.citcorpore.bean.ImportacaoContratosDTO; import br.com.centralit.citcorpore.integracao.ImportacaoContratosDao; import br.com.centralit.citcorpore.metainfo.util.MetaUtil; import br.com.centralit.citcorpore.util.ImportInfoField; import br.com.centralit.citcorpore.util.ImportInfoRecord; import br.com.centralit.citcorpore.util.UtilImportData; import br.com.citframework.excecao.ConnectionException; import br.com.citframework.excecao.TransactionOperationException; import br.com.citframework.integracao.JdbcEngine; import br.com.citframework.integracao.PersistenceEngine; import br.com.citframework.integracao.TransactionControlerImpl; import br.com.citframework.service.CrudServiceImpl; import br.com.citframework.util.Constantes; import br.com.citframework.util.UtilI18N; @SuppressWarnings({"unchecked", "rawtypes"}) public class ImportacaoContratosServiceEjb extends CrudServiceImpl implements ImportacaoContratosService { private ImportacaoContratosDao dao; @Override protected ImportacaoContratosDao getDao() { if (dao == null) { dao = new ImportacaoContratosDao(); } return dao; } /** * Executa a persistencia dos dados * * @param idContrato * @param xml * @return ImportacaoContratosDTO * @author rodrigo.acorse * @throws ConnectionException * @throws TransactionOperationException */ @Override public ImportacaoContratosDTO persisteDados(final HttpServletRequest request, final Integer idContrato, final String xml) throws TransactionOperationException, ConnectionException, Exception { final ImportacaoContratosDTO importacaoContratosDto = new ImportacaoContratosDTO(); importacaoContratosDto.setResultado(false); final Map<String, String> mapChanges = new HashMap<>(); final List colRecordsGeral = new ArrayList(); System.out.println("XML: " + xml); final Collection colRecords = UtilImportData.readXMLSource(xml); if (colRecords != null) { colRecordsGeral.addAll(colRecords); } // Utiliza o primeiro registro somente para fazer algumas valida��es b�sicas antes de entrar no loop ImportInfoRecord importInfoRecord = (ImportInfoRecord) colRecordsGeral.get(0); // Se um contrato foi selecionado na importa��o, verifica se a exporta��o foi feita utilizando um contrato. if (idContrato != null && !idContrato.equals("")) { if (importInfoRecord.getFilter() != null && !importInfoRecord.getFilter().equals("")) { // System.out.println("SUCESSO -> " + importInfoRecord.getTableName() + // " - Registro para atualiza��o de ID - IDCONTRATO: " + importInfoRecord.getFilter() + " para " + // idContrato.toString()); mapChanges.put("IDCONTRATO" + importInfoRecord.getFilter(), idContrato.toString()); } else { importacaoContratosDto.setMensagem(UtilI18N.internacionaliza(request, "importacaoContratos.falhaImportacao") + " " + UtilI18N.internacionaliza(request, "importacaoContratos.arquivoInvalidoSemContrato")); return importacaoContratosDto; } } else { if (importInfoRecord.getFilter() != null && !importInfoRecord.getFilter().equals("")) { importacaoContratosDto.setMensagem(UtilI18N.internacionaliza(request, "importacaoContratos.falhaImportacao") + " " + UtilI18N.internacionaliza(request, "importacaoContratos.arquivoInvalidoComContrato")); return importacaoContratosDto; } } final TransactionControlerImpl transactionControler = new TransactionControlerImpl(Constantes.getValue("DATABASE_ALIAS")); final JdbcEngine jdbcEngine = new JdbcEngine(Constantes.getValue("DATABASE_ALIAS"), null); jdbcEngine.setTransactionControler(transactionControler); transactionControler.start(); for (final Iterator itRecords = colRecordsGeral.iterator(); itRecords.hasNext();) { importInfoRecord = (ImportInfoRecord) itRecords.next(); String key = ""; String keyValue = ""; final String table = importInfoRecord.getTableName(); String where = ""; String sqlInsert = ""; String sqlInsertValues = ""; String sqlUpdate = ""; final List lstParmsInsert = new ArrayList(); final List lstParmsUpdate = new ArrayList(); final List lstParmsWhere = new ArrayList(); for (final Iterator it = importInfoRecord.getColFields().iterator(); it.hasNext();) { final ImportInfoField importInfoField = (ImportInfoField) it.next(); System.out.println("Valor depois da leitura do xml: " + importInfoField.getValueField()); final String typeDB = importInfoField.getType(); if (importInfoField.isKey()) { if (importInfoRecord.getType().equalsIgnoreCase("concrete")) { key = importInfoField.getNameField(); keyValue = importInfoField.getValueField(); } } // Atualiza os ids gerados na exporta��o para os ids corretos da importa��o if (mapChanges.get(importInfoField.getNameField() + importInfoField.getValueField()) != null && StringUtils.isNotBlank(mapChanges.get(importInfoField.getNameField() + importInfoField.getValueField()))) { importInfoField.setValueField(mapChanges.get(importInfoField.getNameField() + importInfoField.getValueField()).toString()); } // Se for CHECK, adiciona o WHERE para valida��o if (importInfoField.isCheck()) { if (where.trim().equals("")) { where = importInfoField.getNameField() + " = ?"; } else { where += " AND " + importInfoField.getNameField() + " = ?"; } if (importInfoField.getValueField().trim().equalsIgnoreCase("null")) { lstParmsWhere.add(null); } else { if (typeDB.startsWith("MONEY") || typeDB.startsWith("DOUBLE") || typeDB.startsWith("DECIMAL") || typeDB.startsWith("NUMERIC") || typeDB.startsWith("NUMBER") || typeDB.startsWith("REAL") || typeDB.startsWith("FLOAT")) { if (importInfoField.getValueField() instanceof String) { lstParmsWhere.add(Double.parseDouble(importInfoField.getValueField())); } else { lstParmsWhere.add(importInfoField.getValueField()); } } else { if (typeDB.startsWith("TIMESTAMP") && importInfoField.getValueField().equalsIgnoreCase("0000-00-00 00:00:00")) { lstParmsWhere.add(new Timestamp(System.currentTimeMillis())); } else { lstParmsWhere.add(MetaUtil.convertType(importInfoField.getType(), importInfoField.getValueField(), null, null)); } } } } if (importInfoField.isExclusion()) { String strExclusion = ""; if (importInfoField.getNameField().equalsIgnoreCase("deleted")) { strExclusion = "(DELETED IS NULL OR DELETED = 'n' OR DELETED = 'N')"; } else if (importInfoField.getNameField().equalsIgnoreCase("datafim")) { strExclusion = "(DATAFIM IS NULL)"; } else if (importInfoField.getNameField().equalsIgnoreCase("situacao")) { strExclusion = "(SITUACAO = 'A')"; } if (where.trim().equals("")) { where = strExclusion; } else { where += " AND " + strExclusion; } } // Adiciona campos para insert if (sqlInsert.trim().equals("")) { sqlInsert = importInfoField.getNameField(); } else { sqlInsert += "," + importInfoField.getNameField(); } if (sqlInsertValues.trim().equals("")) { sqlInsertValues = "?"; } else { sqlInsertValues += "," + "?"; } if (importInfoRecord.getType().equalsIgnoreCase("concrete") && importInfoField.isKey()) { lstParmsInsert.add("<KEY>"); } else { if (importInfoField.getValueField().trim().equalsIgnoreCase("null")) { lstParmsInsert.add(null); } else { if (typeDB.startsWith("MONEY") || typeDB.startsWith("DOUBLE") || typeDB.startsWith("DECIMAL") || typeDB.startsWith("NUMERIC") || typeDB.startsWith("NUMBER") || typeDB.startsWith("REAL") || typeDB.startsWith("FLOAT")) { if (importInfoField.getValueField() instanceof String) { lstParmsInsert.add(Double.parseDouble(importInfoField.getValueField())); } else { lstParmsInsert.add(importInfoField.getValueField()); } } else { if (typeDB.startsWith("TIMESTAMP") && importInfoField.getValueField().equalsIgnoreCase("0000-00-00 00:00:00")) { lstParmsInsert.add(new Timestamp(System.currentTimeMillis())); } else { lstParmsInsert.add(MetaUtil.convertType(importInfoField.getType(), importInfoField.getValueField(), null, null)); } } } } // Adiciona campos para update if (importInfoRecord.getType().equalsIgnoreCase("concrete") && !importInfoField.isKey() || importInfoRecord.getType().equalsIgnoreCase("relation")) { if (sqlUpdate.trim().equals("")) { sqlUpdate = importInfoField.getNameField() + " = ?"; } else { sqlUpdate += "," + importInfoField.getNameField() + " = ?"; } if (importInfoField.getValueField().trim().equalsIgnoreCase("null")) { lstParmsUpdate.add(null); } else { if (typeDB.startsWith("MONEY") || typeDB.startsWith("DOUBLE") || typeDB.startsWith("DECIMAL") || typeDB.startsWith("NUMERIC") || typeDB.startsWith("NUMBER") || typeDB.startsWith("REAL") || typeDB.startsWith("FLOAT")) { if (importInfoField.getValueField() instanceof String) { lstParmsUpdate.add(Double.parseDouble(importInfoField.getValueField())); } else { lstParmsUpdate.add(importInfoField.getValueField()); } } else { if (typeDB.startsWith("TIMESTAMP") && importInfoField.getValueField().equalsIgnoreCase("0000-00-00 00:00:00")) { lstParmsUpdate.add(new Timestamp(System.currentTimeMillis())); } else { lstParmsUpdate.add(MetaUtil.convertType(importInfoField.getType(), importInfoField.getValueField(), null, null)); } } } } } // Execu��o do insert ou update String sqlMensagemErro = null; try { if (importInfoRecord.getType().equalsIgnoreCase("concrete")) { String newKey = null; if (!key.equals("") && !table.trim().equals("") && !where.equals("")) { final List lst = jdbcEngine.execSQL("SELECT " + key + " FROM " + table + " WHERE " + where, lstParmsWhere.toArray(), 0); if (lst == null || lst.size() == 0) { if (!sqlInsert.trim().equals("") && !sqlInsertValues.trim().equals("")) { sqlInsert = "INSERT INTO " + table + "(" + sqlInsert + ") VALUES (" + sqlInsertValues + ")"; final Integer nextKey = PersistenceEngine.getNextKey(this.getDao().getAliasDB(), importInfoRecord.getTableName(), key); if (nextKey != null) { newKey = nextKey.toString(); for (int i = 0; i < lstParmsInsert.size(); i++) { if (lstParmsInsert.get(i) != null && lstParmsInsert.get(i).equals("<KEY>")) { lstParmsInsert.set(i, nextKey); } } } sqlMensagemErro = "<b>Erro de insert</b>:<br/><b>Tabela:</b> " + importInfoRecord.getTableName() + "<br/><b>SQL:</b> " + sqlInsert + "<br/><b>Par�metros:</b> " + lstParmsInsert; jdbcEngine.execUpdate(sqlInsert, lstParmsInsert.toArray()); } } else { if (!sqlUpdate.trim().equals("")) { final Object[] obj = (Object[]) lst.get(0); if (obj[0] != null && !obj[0].toString().equals("")) { newKey = obj[0].toString(); sqlUpdate = "UPDATE " + table + " SET " + sqlUpdate + " WHERE " + key + " = " + newKey; sqlMensagemErro = "<b>Erro de update</b>:<br/><b>Tabela:</b> " + importInfoRecord.getTableName() + "<br/><b>SQL:</b> " + sqlUpdate + "<br/><b>Par�metros:</b> " + lstParmsUpdate; jdbcEngine.execUpdate(sqlUpdate, lstParmsUpdate.toArray()); } } } } // Registra a altera��o dos ids gerados na exporta��o para os ids corretos da importa��o if (importInfoRecord.getType().equalsIgnoreCase("concrete") && !key.equals("") && !keyValue.equals("")) { mapChanges.put(key + keyValue, newKey); } } else { if (!table.trim().equals("") && !where.equals("")) { final List lst = jdbcEngine.execSQL("SELECT * FROM " + table + " WHERE " + where, lstParmsWhere.toArray(), 0); if (lst == null || lst.size() == 0) { if (!sqlInsert.trim().equals("") && !sqlInsertValues.trim().equals("")) { sqlInsert = "INSERT INTO " + table + "(" + sqlInsert + ") VALUES (" + sqlInsertValues + ")"; sqlMensagemErro = "<b>Erro de insert</b>:<br/><b>Tabela:</b> " + importInfoRecord.getTableName() + "<br/><b>SQL:</b> " + sqlInsert + "<br/><b>Par�metros:</b> " + lstParmsInsert; jdbcEngine.execUpdate(sqlInsert, lstParmsInsert.toArray()); } } else { if (!sqlUpdate.trim().equals("")) { lstParmsUpdate.addAll(lstParmsWhere); sqlUpdate = "UPDATE " + table + " SET " + sqlUpdate + " WHERE " + where; sqlMensagemErro = "<b>Erro de update</b>:<br/><b>Tabela:</b> " + importInfoRecord.getTableName() + "<br/><b>SQL:</b> " + sqlUpdate + "<br/><b>Par�metros:</b> " + lstParmsUpdate; jdbcEngine.execUpdate(sqlUpdate, lstParmsUpdate.toArray()); } } } } } catch (final Exception e) { // transactionControler.rollback(); e.printStackTrace(); if (sqlMensagemErro != null) { if (e.getCause() != null && e.getCause().getMessage() != null && !e.getCause().getMessage().equals("")) { sqlMensagemErro += "<br/><b>Erro:</b> " + e.getCause().getMessage(); } if (importacaoContratosDto.getMensagem() == null || importacaoContratosDto.getMensagem().equals("")) { importacaoContratosDto.setMensagem(sqlMensagemErro); } else { importacaoContratosDto.setMensagem(importacaoContratosDto.getMensagem() + "<br/><br/>" + sqlMensagemErro); } } } } transactionControler.commit(); transactionControler.close(); importacaoContratosDto.setResultado(true); return importacaoContratosDto; } }