package br.com.centralit.citcorpore.batch;
import java.io.File;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import br.com.centralit.citcorpore.bean.ControleImportarDadosDTO;
import br.com.centralit.citcorpore.bean.ExternalConnectionDTO;
import br.com.centralit.citcorpore.bean.ImportarDadosDTO;
import br.com.centralit.citcorpore.bean.UploadDTO;
import br.com.centralit.citcorpore.integracao.ControleImportarDadosDao;
import br.com.centralit.citcorpore.integracao.ImportarDadosDao;
import br.com.centralit.citcorpore.negocio.ControleImportarDadosService;
import br.com.centralit.citcorpore.negocio.ExternalConnectionService;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citged.bean.ControleGEDDTO;
import br.com.centralit.citged.negocio.ControleGEDService;
import br.com.citframework.integracao.JdbcEngine;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.UtilDatas;
@SuppressWarnings({"unchecked", "rawtypes"})
public class MonitoraImportacaoDeDados implements Runnable {
private final ControleImportarDadosDao controleDao = new ControleImportarDadosDao();
private final ImportarDadosDao importarDadosDao = new ImportarDadosDao();
@Override
public void run() {
while (true) {
Collection<ImportarDadosDTO> listaDeImportacoes;
Timestamp dataHoraAtual = UtilDatas.getDataHoraAtual();
Date dataAtual = UtilDatas.getDataAtual();
Date dataHoraExecutar;
try {
//Consulta todas as rotinas ativas e com execu��o agendada
listaDeImportacoes = importarDadosDao.listAtivosEComRotinaAgendada();
if(listaDeImportacoes == null || listaDeImportacoes.isEmpty())
return;
ControleImportarDadosDTO controle;
for (ImportarDadosDTO importarDadosDTO : listaDeImportacoes) {
//Consulta a ultima execu��o da rotina
controle = controleDao.consultarControleImportarDados(importarDadosDTO);
//Se n�o houve nenhuma execu��o da rotina ela � executada
if(controle == null){
executarScript(importarDadosDTO);
continue;
}
//Por periodo
if(importarDadosDTO.getExecutarPor().equalsIgnoreCase("P")){
dataHoraExecutar = UtilDatas.alteraData(controle.getDataExecucao(), importarDadosDTO.getPeriodoHora(), Calendar.HOUR_OF_DAY);
if(dataHoraAtual.compareTo(dataHoraExecutar) > 0)
executarScript(importarDadosDTO);
} else {
//Por hora marcada
dataAtual = UtilDatas.getDataAtual();
dataHoraExecutar = dataAtual;
dataHoraExecutar = UtilDatas.alteraData(dataAtual, Integer.parseInt(importarDadosDTO.getHoraExecucao().substring(0, 2)), Calendar.HOUR_OF_DAY);
dataHoraExecutar = UtilDatas.alteraData(dataHoraExecutar, Integer.parseInt(importarDadosDTO.getHoraExecucao().substring(3, 5)), Calendar.MINUTE);
dataAtual = new Date(dataHoraAtual.getTime());
//Validar se j� n�o foi executado antes
if(controle.getDataExecucao().compareTo(dataHoraExecutar) < 0)
//Validar se a hora marcada para execu��o � maior que a data atual
if(dataHoraExecutar.compareTo(dataAtual) < 0)
executarScript(importarDadosDTO);
}
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(300000);
} catch (InterruptedException e) {
}
}
}
/**
* Executa os scripts ou os jars vinculados ao parametro
* @param importarDadosDTO
*/
@SuppressWarnings("deprecation")
public void executarScript(ImportarDadosDTO importarDadosDTO){
salvarDadosDaExecucao(importarDadosDTO);
try {
if(importarDadosDTO.getImportarPor().equalsIgnoreCase("S")){
//Recuperar campos da conex�o (ExternalConnectionDTO)
ExternalConnectionService externalConnectionService = (ExternalConnectionService) ServiceLocator.getInstance().getService(ExternalConnectionService.class, null);
ExternalConnectionDTO externalConnectionDTO = new ExternalConnectionDTO();
externalConnectionDTO.setIdExternalConnection(importarDadosDTO.getIdExternalConnection());
externalConnectionDTO = (ExternalConnectionDTO) externalConnectionService.restore(externalConnectionDTO);
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
String conteudoScript = importarDadosDTO.getScript();
JdbcEngine jdbcEngine = new JdbcEngine("jdbc/citsmart", null);
scope.put("jdbcEngine", scope, jdbcEngine);
if(externalConnectionDTO == null || externalConnectionDTO.getIdExternalConnection() == null)
System.out.println("Sem dados da conex�o externa.");
else {
scope.put("url", scope, externalConnectionDTO.getUrlJdbc());
scope.put("dbName", scope, externalConnectionDTO.getJdbcDbName());
scope.put("driver", scope, externalConnectionDTO.getJdbcDriver());
scope.put("password", scope, externalConnectionDTO.getJdbcPassword());
scope.put("user", scope, externalConnectionDTO.getJdbcUser());
scope.put("schema", scope, externalConnectionDTO.getSchemaDb());
}
scope.put("dataAtualFormatada", scope, UtilDatas.getDataAtual().toLocaleString().replace("/", "-").replace(" 00:00:00", ""));
scope.put("dataAtual", scope, UtilDatas.getDataAtual());
cx.evaluateString(scope, conteudoScript, "JavaScript", 0, null);
System.out.println("Script de importa��o executado com sucesso: ID:" + importarDadosDTO.getIdImportarDados() + " as " + UtilDatas.getDataHoraAtual());
} else if(importarDadosDTO.getImportarPor().equalsIgnoreCase("E")){
ControleGEDService controleGedService = (ControleGEDService) ServiceLocator.getInstance().getService(ControleGEDService.class, null);
Collection colAnexos = controleGedService.listByIdTabelaAndID(ControleGEDDTO.TABELA_IMPORTARDADOS, importarDadosDTO.getIdImportarDados());
Collection colAnexosUploadDTO = controleGedService.convertListControleGEDToUploadDTO(colAnexos);
ProcessBuilder pb;
UploadDTO upload;
String caminho = CITCorporeUtil.CAMINHO_REAL_APP + "tempUpload";
for (Iterator<UploadDTO> it = colAnexosUploadDTO.iterator(); it.hasNext();){
upload = (UploadDTO)it.next();
pb = new ProcessBuilder("java", "-jar", upload.getNameFile());
pb.directory(new File(caminho));
}
}
} catch (NullPointerException e) {
System.out.println("Script de importa��o executado com erro: Objeto nulo. As " + UtilDatas.getDataHoraAtual());
} catch (Exception e) {
System.out.println("Script de importa��o executado com erro: ID:" + importarDadosDTO.getIdImportarDados() + " as " + UtilDatas.getDataHoraAtual());
}
}
/**
* Salva a execu��o da rotina
*
* @param importar
*/
public void salvarDadosDaExecucao(ImportarDadosDTO importar) {
ControleImportarDadosDTO controle = new ControleImportarDadosDTO();
controle.setDataExecucao(UtilDatas.getDataHoraAtual());
controle.setIdImportarDados(importar.getIdImportarDados());
ControleImportarDadosService controleService;
try {
controleService = (ControleImportarDadosService) ServiceLocator.getInstance().getService(ControleImportarDadosService.class, null);
controle = (ControleImportarDadosDTO) controleService.create(controle);
} catch (Exception e) {
}
}
}