package br.com.centralit.citcorpore.negocio; import java.text.ParseException; import java.util.Collection; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.SchedulerException; import br.com.centralit.citajax.html.DocumentHTML; import br.com.centralit.citajax.html.HTMLSelect; import br.com.centralit.citcorpore.batch.JobProcessamentoBatchExecuteSQL; import br.com.centralit.citcorpore.bean.ProcessamentoBatchDTO; import br.com.centralit.citcorpore.integracao.ProcessamentoBatchDao; import br.com.citframework.excecao.ServiceException; import br.com.citframework.service.CrudServiceImpl; import br.com.citframework.util.UtilI18N; public class ProcessamentoBatchServiceEjb extends CrudServiceImpl implements ProcessamentoBatchService{ private static final long serialVersionUID = -2335223427371986078L; private ProcessamentoBatchDao dao; protected ProcessamentoBatchDao getDao() { if (dao == null) { dao = new ProcessamentoBatchDao(); } return dao; } public Collection getAtivos() throws Exception { return getDao().getAtivos(); } public boolean existeDuplicidade(ProcessamentoBatchDTO processamentoBatch) throws Exception { return getDao().existeDuplicidade(processamentoBatch); } public boolean existeDuplicidadeClasse(ProcessamentoBatchDTO processamentoBatch) throws Exception{ return getDao().existeDuplicidadeClasse(processamentoBatch); } @Override public ProcessamentoBatchDTO findById(Integer idProcessamentoBatchPadrao) { return getDao().findById(idProcessamentoBatchPadrao); } public void agendaJob(ProcessamentoBatchDTO procDto, DocumentHTML document, HttpServletRequest request) { org.quartz.SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory(); org.quartz.Scheduler scheduler = null; try { scheduler = schedulerFactory.getScheduler("CitSmartMonitor"); } catch (SchedulerException e) { e.printStackTrace(); } boolean bAgendouFase1 = false; boolean bAgendouFase2 = false; if (scheduler != null) { if (procDto.getSituacao().equalsIgnoreCase("A")) { try { JobDetail jobDetailSQLs = new JobDetail("Processamento_CITSMART_" + procDto.getIdProcessamentoBatch(), "grupoBatch_CITSMART", JobProcessamentoBatchExecuteSQL.class); CronTrigger cronTrigger = new CronTrigger("ProcessamentoBatchCITSMART_" + procDto.getIdProcessamentoBatch(), "CITSMART_PROC_BATCH", procDto.getExpressaoCRON()); String str[] = scheduler.getJobNames("grupoBatch_CITSMART"); boolean existeJobAdicionado = false; if (str != null) { for (int i = 0; i < str.length; i++) { if (str[i].equalsIgnoreCase("Processamento_CITSMART_" + procDto.getIdProcessamentoBatch())) { existeJobAdicionado = true; } } } if (existeJobAdicionado) { try { boolean retDelJob = scheduler.deleteJob("Processamento_CITSMART_" + procDto.getIdProcessamentoBatch(), "grupoBatch_CITSMART"); System.out.println("Exclusao do Job - " + "Processamento_CITSMART_" + procDto.getIdProcessamentoBatch() + ": " + retDelJob); } catch (Exception e) { e.printStackTrace(); } } scheduler.scheduleJob(jobDetailSQLs, cronTrigger); bAgendouFase1 = true; System.out.println("JOB INICIADO COM SUCESSO!!! " + procDto.getIdProcessamentoBatch() + " --> " + procDto.getExpressaoCRON()); } catch (SchedulerException e) { System.out.println("PROBLEMAS AO AGENDAR JOB: " + "Processamento batch CITSMART - SQL: " + procDto.getIdProcessamentoBatch()); e.printStackTrace(); } catch (ParseException e) { System.out.println("PROBLEMAS AO AGENDAR JOB: " + "Processamento batch CITSMART - SQL: " + procDto.getIdProcessamentoBatch()); e.printStackTrace(); } } } else { System.out.println("SCHEDULER NAO ENCONTRADO - Problemas no start de Processamentos Batch!!!"); } if (bAgendouFase1){ try { scheduler.start(); bAgendouFase2 = true; } catch (SchedulerException e) { System.out.println("PROBLEMAS AO START OS JOBS BATCH SQLs!!!"); e.printStackTrace(); } } if ((!bAgendouFase1) || (!bAgendouFase2)) { document.alert(UtilI18N.internacionaliza(request, "processamentoBatch.problemaNoAgendamento")); } } public void montaExpressaoCron(ProcessamentoBatchDTO processamentoBatchDTO) { String expressaoCron = new String(); if (processamentoBatchDTO.getSegundos() != null) { expressaoCron += processamentoBatchDTO.getSegundos() + " "; } if (processamentoBatchDTO.getMinutos() != null) { expressaoCron += processamentoBatchDTO.getMinutos() + " "; } if (processamentoBatchDTO.getHoras() != null) { expressaoCron += processamentoBatchDTO.getHoras() + " "; } if (processamentoBatchDTO.getDiaDoMes() != null) { expressaoCron += processamentoBatchDTO.getDiaDoMes() + " "; } if (processamentoBatchDTO.getMes() != null) { expressaoCron += processamentoBatchDTO.getMes() + " "; } if (processamentoBatchDTO.getDiaDaSemana() != null) { expressaoCron += processamentoBatchDTO.getDiaDaSemana() + " "; } if (processamentoBatchDTO.getAno() != null) { expressaoCron += processamentoBatchDTO.getAno(); } processamentoBatchDTO.setExpressaoCRON(expressaoCron); } public void setaPropriedadesExpressaoCron(ProcessamentoBatchDTO processamentoBatchDTO) { if (processamentoBatchDTO.getExpressaoCRON() != null && !processamentoBatchDTO.getExpressaoCRON().isEmpty()) { String expressaoCron = processamentoBatchDTO.getExpressaoCRON().trim(); expressaoCron = expressaoCron.replaceAll(" ", " "); String partes[] = expressaoCron.split(" "); if (partes.length > 5) { processamentoBatchDTO.setSegundos(partes[0]); processamentoBatchDTO.setMinutos(partes[1]); processamentoBatchDTO.setHoras(partes[2]); processamentoBatchDTO.setDiaDoMes(partes[3]); processamentoBatchDTO.setMes(partes[4]); processamentoBatchDTO.setDiaDaSemana(partes[5]); } if (partes.length > 6) { processamentoBatchDTO.setAno(partes[6]); } } } /** * @author euler.ramos */ public boolean validaExpressaoCron(DocumentHTML document, HttpServletRequest request, ProcessamentoBatchDTO processamentoBatchDTO) { if ((processamentoBatchDTO.getDiaDoMes() != null)&&(processamentoBatchDTO.getDiaDaSemana() != null)) { //'?' can only be specfied for Day-of-Month -OR- Day-of-Week. if ((processamentoBatchDTO.getDiaDoMes().equalsIgnoreCase("?"))&&(processamentoBatchDTO.getDiaDaSemana().equalsIgnoreCase("?"))) { document.alert(UtilI18N.internacionaliza(request,"processamentoBatch.aoMenosDiaMesOuDiaSemana")); return false; } //Somente o Dia do m�s ou dia da semana deve ser informado. //Support for specifying both a day-of-week AND a day-of-month parameter is not implemented. if ((!processamentoBatchDTO.getDiaDoMes().equalsIgnoreCase("?"))&&(!processamentoBatchDTO.getDiaDaSemana().equalsIgnoreCase("?"))) { document.alert(UtilI18N.internacionaliza(request,"processamentoBatch.diaMesdiaSemanaMesmoTempo")); return false; } } //Verificando a express�o cron para saber se define um agendamento pass�vel de ser executado. if((processamentoBatchDTO.getExpressaoCRON() != null)&&(processamentoBatchDTO.getExpressaoCRON().length()>0)){ Date dtProximaEx = this.proximaExecucao(processamentoBatchDTO.getExpressaoCRON()); if (dtProximaEx == null){ document.alert(UtilI18N.internacionaliza(request,"processamentoBatch.naoSeraExecutado")); return false; } } else { document.alert(UtilI18N.internacionaliza(request,"processamentoBatch.expressaoCronInvalida")); return false; } return true; } /** * @author euler.ramos */ public boolean permiteAgendamento(String cronExpr){ boolean resultado = false; if(CronExpression.isValidExpression(cronExpr)){ Date dataProxExec = this.proximaExecucao(cronExpr); if (dataProxExec!=null){ resultado = true; } } return resultado; } public void populaSelects(DocumentHTML document, HttpServletRequest request, HttpServletResponse response) throws Exception { HTMLSelect comboAno = (HTMLSelect) document.getSelectById("ano"); comboAno.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); for (Integer ano = 2014; ano <= 2020; ano++) { comboAno.addOption(ano.toString(), ano.toString()); } HTMLSelect comboDiaDaSemana = (HTMLSelect) document.getSelectById("diaDaSemana"); comboDiaDaSemana.addOption("?", UtilI18N.internacionaliza(request, "citcorpore.comum.selecione")); comboDiaDaSemana.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); comboDiaDaSemana.addOption("2", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.segundaFeira")); comboDiaDaSemana.addOption("3", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.tercaFeira")); comboDiaDaSemana.addOption("4", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.quartaFeira")); comboDiaDaSemana.addOption("5", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.quintaFeira")); comboDiaDaSemana.addOption("6", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.sextaFeira")); comboDiaDaSemana.addOption("7", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.sabado")); comboDiaDaSemana.addOption("1", UtilI18N.internacionaliza(request, "citcorpore.texto.diaSemana.domingo")); HTMLSelect comboDiaDoMes = (HTMLSelect) document.getSelectById("diaDoMes"); comboDiaDoMes.addOption("?", UtilI18N.internacionaliza(request, "citcorpore.comum.selecione")); comboDiaDoMes.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); for (Integer dia = 1; dia <= 31; dia++) { comboDiaDoMes.addOption(dia.toString(), dia.toString()); } HTMLSelect comboHoras = (HTMLSelect) document.getSelectById("horas"); comboHoras.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todas")); for (Integer hora = 0; hora <= 23; hora++) { comboHoras.addOption(hora.toString(), hora.toString()); } HTMLSelect comboMes = (HTMLSelect) document.getSelectById("mes"); comboMes.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); comboMes.addOption("1", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.janeiro")); comboMes.addOption("2", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.fevereiro")); comboMes.addOption("3", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.marco")); comboMes.addOption("4", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.abril")); comboMes.addOption("5", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.maio")); comboMes.addOption("6", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.junho")); comboMes.addOption("7", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.julho")); comboMes.addOption("8", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.agosto")); comboMes.addOption("9", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.setembro")); comboMes.addOption("10", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.outubro")); comboMes.addOption("11", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.novembro")); comboMes.addOption("12", UtilI18N.internacionaliza(request, "citcorpore.texto.mes.dezembro")); HTMLSelect comboMinutos = (HTMLSelect) document.getSelectById("minutos"); comboMinutos.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); for (Integer minuto = 0; minuto <= 59; minuto++) { comboMinutos.addOption(minuto.toString(), minuto.toString()); } HTMLSelect comboSegundos = (HTMLSelect) document.getSelectById("segundos"); comboSegundos.addOption("*", UtilI18N.internacionaliza(request, "citcorpore.comum.todos")); for (Integer segundo = 0; segundo <= 59; segundo++) { comboSegundos.addOption(segundo.toString(), segundo.toString()); } HTMLSelect comboSituacao = (HTMLSelect) document.getSelectById("situacao"); comboSituacao.addOption("A", UtilI18N.internacionaliza(request, "citcorpore.comum.ativo")); comboSituacao.addOption("I", UtilI18N.internacionaliza(request, "citcorpore.comum.inativo")); comboSituacao.setSelectedIndex(1); } /** * Retorna a pr�xima data de execu��o definida na express�o Cron passada como par�metro * @author euler.ramos */ public Date proximaExecucao(String expressaoCron){ try { Date data = new Date(); CronExpression cronExpression = new CronExpression(expressaoCron); return cronExpression.getNextValidTimeAfter(data); } catch (ParseException e) { e.printStackTrace(); } return null; } @Override public ProcessamentoBatchDTO getAgendamentoPadrao() throws ServiceException, Exception { return getDao().getAgendamentoPadrao(); } }