org.openbizview.util.Programacion.java Source code

Java tutorial

Introduction

Here is the source code for org.openbizview.util.Programacion.java

Source

/*
 *  Copyright (C) 2011 - 2016  DVCONSULTORES
    
Este programa es software libre: usted puede redistribuirlo y/o modificarlo 
bajo los terminos de la Licencia Pblica General GNU publicada 
por la Fundacion para el Software Libre, ya sea la version 3 
de la Licencia, o (a su eleccion) cualquier version posterior.
    
Este programa se distribuye con la esperanza de que sea til, pero 
SIN GARANTiA ALGUNA; ni siquiera la garantia implicita 
MERCANTIL o de APTITUD PARA UN PROPoSITO DETERMINADO. 
Consulte los detalles de la Licencia Pblica General GNU para obtener 
una informacion mas detallada. 
    
Deberia haber recibido una copia de la Licencia Pblica General GNU 
junto a este programa. 
En caso contrario, consulte <http://www.gnu.org/licenses/>.
 */

package org.openbizview.util;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.IGetParameterDefinitionTask;
import org.eclipse.birt.report.engine.api.IParameterDefn;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.ReportEngine;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.CalendarIntervalScheduleBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.TriggerKey.*;
import static org.quartz.JobKey.*;

@ManagedBean
@ViewScoped
public class Programacion extends Bd implements Serializable {

    /**
     * 
     */

    private static final long serialVersionUID = 1L;

    private LazyDataModel<Programacion> lazyModel;

    /**
     * @return the lazyModel
     */
    public LazyDataModel<Programacion> getLazyModel() {
        return lazyModel;
    }

    @PostConstruct
    public void init() {
        selectDiasSemana();
    }

    //Constructor
    public Programacion() throws SchedulerException {
        if (instancia == null) {
            instancia = "99999";
        }
        //Si no tiene acceso al mdulo no puede ingresar
        if (new SeguridadMenuBean().opcmnu("M25") == "false") {
            RequestContext.getCurrentInstance().execute("PF('idleDialogNP').show()");
        }
        //System.out.println("Estatus TRIGGER1: " + schd.checkExists(triggerKey("TRIGGER1", "unico")));
        //System.out.println("Estatus TRIGGER2: " + schd.checkExists(triggerKey("TRIGGER2", "unico")));
        //System.out.println("Estatus TRIGGER3: " + schd.checkExists(triggerKey("TRIGGER3", "unico")));   

        String[] vecreporte = reporte.split("\\ - ", -1);
        inputs = new String[paramsNumber(vecreporte[0])];
        lazyModel = new LazyDataModel<Programacion>() {
            /**
             * 
             */
            private static final long serialVersionUID = 7217573531435419432L;

            @Override
            public List<Programacion> load(int first, int pageSize, String sortField, SortOrder sortOrder,
                    Map<String, Object> filters) {
                //Filtro
                if (filters != null) {
                    for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
                        String filterProperty = it.next(); // table column name = field name
                        filterValue = filters.get(filterProperty);
                    }
                }
                try {
                    //Consulta
                    select(first, pageSize, sortField, filterValue);
                    //Counter
                    counter(filterValue);
                    //Contador lazy
                    lazyModel.setRowCount(rows); //Necesario para crear la paginacin
                } catch (SQLException | NamingException e) {
                    e.printStackTrace();
                }
                return list;
            }

            //Arregla bug de primefaces
            @Override
            /**
            * Arregla el Issue 1544 de primefaces lazy loading porge generaba un error
            * de divisor equal a cero, es solamente un override
            */
            public void setRowIndex(int rowIndex) {
                /*
                 * The following is in ancestor (LazyDataModel):
                 * this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize);
                 */
                if (rowIndex == -1 || getPageSize() == 0) {
                    super.setRowIndex(-1);
                } else
                    super.setRowIndex(rowIndex % getPageSize());
            }

        };

    }

    public void reset() {
        mailreporteFiltro = null;
        mailfrecuenciaFiltro = null;
        mailgrupoFiltro = null;
    }

    //public void init() throws SchedulerException, NamingException{
    //   recuperarTriggers();
    //}
    private String session = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
            .get("session"); //Session
    private String instancia = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
            .get("instancia"); //Usuario logeado
    private String tarea = ""; //Nombre de la tarea
    private String vltrigger = ""; //Nombre del disparador
    private String diasemana = ""; //Da de la semana
    private String frecuencia = ""; //Fercuencia de repeticin
    private String dias = ""; // Das de repeticin del reporte
    private String diames = "1"; //Da del mes personalizado
    private String horarepeticion = "0";
    private String asunto = "";
    private String contenido = "";
    private Date diainicio = new Date();
    private Object filterValue = "";
    private List<Programacion> list = new ArrayList<Programacion>();
    private int rows;
    FacesMessage msj = null;
    PntGenerica consulta = new PntGenerica();
    private String idgrupo = "";
    private String reporte = "";
    ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext(); //Toma ruta real de la aplicacin
    SchedulerFactory schdFact = new StdSchedulerFactory();
    Scheduler schd = schdFact.getScheduler();
    java.util.Date fechadia = new java.util.Date();

    //Programacin lista tabla
    private String vdisparador;
    private String vgrupo;
    private String vdiasem;
    private String vfrecuencia;
    private String vfrecuenciades;
    private String vasunto;
    private String vcontenido;
    private String vcodrep;
    private String vjob;
    private String vidgrupo;
    private String viddesidgrupo;
    private String vdiames;
    private String vdiainicio;
    private String vactivadetalletb;
    private String vparamvalues;
    private String vintervalo;

    //Para detener las tareas
    private String activa;
    private String clase;
    private String statusIncon;

    //Variables para tomar los nombres de parmetros y pasarlos a la tabla
    private String[][] vlTabla;
    String arregloParametros; //Toma el valor del arreglo de los parmetros del reporte  
    String arregloNombreParametros; //Toma el valor del arreglo de los parmetros del reporte  

    //Opciones de envo
    private String opctareas = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
            .get("opc");
    private String ruta_salida = "URL"; //Directorio de envo

    //Formatos
    private String formato;
    private String vformato;

    //Filtros de bsqueda
    private String mailreporteFiltro = (String) FacesContext.getCurrentInstance().getExternalContext()
            .getSessionMap().get("mailreporte");
    private String mailfrecuenciaFiltro = (String) FacesContext.getCurrentInstance().getExternalContext()
            .getSessionMap().get("mailfrecuencia");
    private String mailgrupoFiltro = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
            .get("mailgrupo");

    /**
     * @return the statusIncon
     */
    public String getStatusIncon() {
        return statusIncon;
    }

    /**
     * @param statusIncon the statusIncon to set
     */
    public void setStatusIncon(String statusIncon) {
        this.statusIncon = statusIncon;
    }

    /**
     * @return the mailreporteFiltro
     */
    public String getMailreporteFiltro() {
        return mailreporteFiltro;
    }

    /**
     * @param mailreporteFiltro the mailreporteFiltro to set
     */
    public void setMailreporteFiltro(String mailreporteFiltro) {
        this.mailreporteFiltro = mailreporteFiltro;
    }

    /**
     * @return the mailfrecuenciaFiltro
     */
    public String getMailfrecuenciaFiltro() {
        return mailfrecuenciaFiltro;
    }

    /**
     * @param mailfrecuenciaFiltro the mailfrecuenciaFiltro to set
     */
    public void setMailfrecuenciaFiltro(String mailfrecuenciaFiltro) {
        this.mailfrecuenciaFiltro = mailfrecuenciaFiltro;
    }

    /**
     * @return the mailgrupoFiltro
     */
    public String getMailgrupoFiltro() {
        return mailgrupoFiltro;
    }

    /**
     * @param mailgrupoFiltro the mailgrupoFiltro to set
     */
    public void setMailgrupoFiltro(String mailgrupoFiltro) {
        this.mailgrupoFiltro = mailgrupoFiltro;
    }

    /**
     * @return the formato
     */
    public String getFormato() {
        return formato;
    }

    /**
     * @param formato the formato to set
     */
    public void setFormato(String formato) {
        this.formato = formato;
    }

    /**
     * @return the vformato
     */
    public String getVformato() {
        return vformato;
    }

    /**
     * @param vformato the vformato to set
     */
    public void setVformato(String vformato) {
        this.vformato = vformato;
    }

    /**
     * @return the ruta_salida
     */
    public String getRuta_salida() {
        return ruta_salida;
    }

    /**
     * @param ruta_salida the ruta_salida to set
     */
    public void setRuta_salida(String ruta_salida) {
        this.ruta_salida = ruta_salida;
    }

    /**
     * @return the opctareas
     */
    public String getOpctareas() {
        return opctareas;
    }

    /**
     * @param opctareas the opctareas to set
     */
    public void setOpctareas(String opctareas) {
        this.opctareas = opctareas;
    }

    /**
     * @return the vactivadetalletb
     */
    public String getVactivadetalletb() {
        return vactivadetalletb;
    }

    /**
     * @param vactivadetalletb the vactivadetalletb to set
     */
    public void setVactivadetalletb(String vactivadetalletb) {
        this.vactivadetalletb = vactivadetalletb;
    }

    /**
     * @return the activa
     */
    public String getActiva() {
        return activa;
    }

    /**
     * @param activa the activa to set
     */
    public void setActiva(String activa) {
        this.activa = activa;
    }

    /**
     * @return the clase
     */
    public String getClase() {
        return clase;
    }

    /**
     * @param clase the clase to set
     */
    public void setClase(String clase) {
        this.clase = clase;
    }

    /**
     * @return the vdisparador
     */
    public String getVdisparador() {
        return vdisparador;
    }

    /**
     * @param vdisparador the vdisparador to set
     */
    public void setVdisparador(String vdisparador) {
        this.vdisparador = vdisparador;
    }

    /**
     * @return the vgrupo
     */
    public String getVgrupo() {
        return vgrupo;
    }

    /**
     * @param vgrupo the vgrupo to set
     */
    public void setVgrupo(String vgrupo) {
        this.vgrupo = vgrupo;
    }

    /**
     * @return the vdiasem
     */
    public String getVdiasem() {
        return vdiasem;
    }

    /**
     * @param vdiasem the vdiasem to set
     */
    public void setVdiasem(String vdiasem) {
        this.vdiasem = vdiasem;
    }

    /**
     * @return the vfrecuencia
     */
    public String getVfrecuencia() {
        return vfrecuencia;
    }

    /**
     * @param vfrecuencia the vfrecuencia to set
     */
    public void setVfrecuencia(String vfrecuencia) {
        this.vfrecuencia = vfrecuencia;
    }

    /**
     * @return the vfrecuenciades
     */
    public String getVfrecuenciades() {
        return vfrecuenciades;
    }

    /**
     * @param vfrecuenciades the vfrecuenciades to set
     */
    public void setVfrecuenciades(String vfrecuenciades) {
        this.vfrecuenciades = vfrecuenciades;
    }

    /**
     * @return the vasunto
     */
    public String getVasunto() {
        return vasunto;
    }

    /**
     * @param vasunto the vasunto to set
     */
    public void setVasunto(String vasunto) {
        this.vasunto = vasunto;
    }

    /**
     * @return the vcontenido
     */
    public String getVcontenido() {
        return vcontenido;
    }

    /**
     * @param vcontenido the vcontenido to set
     */
    public void setVcontenido(String vcontenido) {
        this.vcontenido = vcontenido;
    }

    /**
     * @return the vcodrep
     */
    public String getVcodrep() {
        return vcodrep;
    }

    /**
     * @param vcodrep the vcodrep to set
     */
    public void setVcodrep(String vcodrep) {
        this.vcodrep = vcodrep;
    }

    /**
     * @return the vjob
     */
    public String getVjob() {
        return vjob;
    }

    /**
     * @param vjob the vjob to set
     */
    public void setVjob(String vjob) {
        this.vjob = vjob;
    }

    /**
     * @return the vidgrupo
     */
    public String getVidgrupo() {
        return vidgrupo;
    }

    /**
     * @param vidgrupo the vidgrupo to set
     */
    public void setVidgrupo(String vidgrupo) {
        this.vidgrupo = vidgrupo;
    }

    /**
     * @return the viddesidgrupo
     */
    public String getViddesidgrupo() {
        return viddesidgrupo;
    }

    /**
     * @param viddesidgrupo the viddesidgrupo to set
     */
    public void setViddesidgrupo(String viddesidgrupo) {
        this.viddesidgrupo = viddesidgrupo;
    }

    /**
     * @return the vdiames
     */
    public String getVdiames() {
        return vdiames;
    }

    /**
     * @param vdiames the vdiames to set
     */
    public void setVdiames(String vdiames) {
        this.vdiames = vdiames;
    }

    /**
     * @return the vdiainicio
     */
    public String getVdiainicio() {
        return vdiainicio;
    }

    /**
     * @param vdiainicio the vdiainicio to set
     */
    public void setVdiainicio(String vdiainicio) {
        this.vdiainicio = vdiainicio;
    }

    /**
     * @return the filterValue
     */
    public Object getFilterValue() {
        return filterValue;
    }

    /**
     * @param filterValue the filterValue to set
     */
    public void setFilterValue(Object filterValue) {
        this.filterValue = filterValue;
    }

    /**
     * @return the list
     */
    public List<Programacion> getList() {
        return list;
    }

    /**
     * @param list the list to set
     */
    public void setList(List<Programacion> list) {
        this.list = list;
    }

    /**
     * @param lazyModel the lazyModel to set
     */
    public void setLazyModel(LazyDataModel<Programacion> lazyModel) {
        this.lazyModel = lazyModel;
    }

    /**
     * @return the idgrupo
     */
    public String getIdgrupo() {
        return idgrupo;
    }

    /**
     * @param idgrupo the idgrupo to set
     */
    public void setIdgrupo(String idgrupo) {
        this.idgrupo = idgrupo;
    }

    /**
     * @return the tarea
     */
    public String getTarea() {
        return tarea;
    }

    /**
     * @param tarea the tarea to set
     */
    public void setTarea(String tarea) {
        this.tarea = tarea;
    }

    /**
     * @return the vltrigger
     */
    public String getVltrigger() {
        return vltrigger;
    }

    /**
     * @param vltrigger the vltrigger to set
     */
    public void setVltrigger(String vltrigger) {
        this.vltrigger = vltrigger;
    }

    /**
     * @return the diasemana
     */
    public String getDiasemana() {
        return diasemana;
    }

    /**
     * @param diasemana the diasemana to set
     */
    public void setDiasemana(String diasemana) {
        this.diasemana = diasemana;
    }

    /**
     * @return the frecuencia
     */
    public String getFrecuencia() {
        return frecuencia;
    }

    /**
     * @param frecuencia the frecuencia to set
     */
    public void setFrecuencia(String frecuencia) {
        this.frecuencia = frecuencia;
    }

    /**
     * @return the dias
     */
    public String getDias() {
        return dias;
    }

    /**
     * @param dias the dias to set
     */
    public void setDias(String dias) {
        this.dias = dias;
    }

    /**
     * @return the rows
     */
    public int getRows() {
        return rows;
    }

    /**
     * @param rows the rows to set
     */
    public void setRows(int rows) {
        this.rows = rows;
    }

    /**
     * @return the reporte
     */
    public String getReporte() {
        return reporte;
    }

    /**
     * @param reporte the reporte to set
     */
    public void setReporte(String reporte) {
        this.reporte = reporte;
    }

    /**
     * @return the asunto
     */
    public String getAsunto() {
        return asunto;
    }

    /**
     * @param asunto the asunto to set
     */
    public void setAsunto(String asunto) {
        this.asunto = asunto;
    }

    /**
     * @return the contenido
     */
    public String getContenido() {
        return contenido;
    }

    /**
     * @param contenido the contenido to set
     */
    public void setContenido(String contenido) {
        this.contenido = contenido;
    }

    /**
    * @return the diames
    */
    public String getDiames() {
        return diames;
    }

    /**
     * @param diames the diames to set
     */
    public void setDiames(String diames) {
        this.diames = diames;
    }

    /**
     * @return the diainicio
     */
    public Date getDiainicio() {
        return diainicio;
    }

    /**
     * @param diainicio the diainicio to set
     */
    public void setDiainicio(Date diainicio) {
        this.diainicio = diainicio;
    }

    /**
     * @return the horarepeticion
     */
    public String getHorarepeticion() {
        return horarepeticion;
    }

    /**
     * @param horarepeticion the horarepeticion to set
     */
    public void setHorarepeticion(String horarepeticion) {
        this.horarepeticion = horarepeticion;
    }

    /**
     * @return the vlTabla
     */
    public String[][] getVlTabla() {
        return vlTabla;
    }

    /**
     * @param vlTabla the vlTabla to set
     */
    public void setVlTabla(String[][] vlTabla) {
        this.vlTabla = vlTabla;
    }

    /**
     * @return the vparamvalues
     */
    public String getVparamvalues() {
        return vparamvalues;
    }

    /**
     * @param vparamvalues the vparamvalues to set
     */
    public void setVparamvalues(String vparamvalues) {
        this.vparamvalues = vparamvalues;
    }

    /**
     * @return the vintervalo
     */
    public String getVintervalo() {
        return vintervalo;
    }

    /**
     * @param vintervalo the vintervalo to set
     */
    public void setVintervalo(String vintervalo) {
        this.vintervalo = vintervalo;
    }

    /**
    * Metodo que da la informacion mas detallada sobre el horario, como hora de inicio de la tarea y cada
     * cuanto tiempo se ejecute la tarea
     */
    public void iniciarTarea() throws NamingException {
        //
        String[] vecreporte = reporte.split("\\ - ", -1);
        arregloParametros = StringUtils.join(inputs, "|").toUpperCase();

        //Creamos la instancia calendario para separar en dia, mes y ao la fecha seleccionada
        Calendar cal = Calendar.getInstance();
        cal.setTime(diainicio);
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minutos = cal.get(Calendar.MINUTE); //Para iniciar meses comenzando desde enero = 0

        if (frecuencia.equals("0")) {
            iniciarTareaDiaria(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "0",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("1")) {
            iniciarTareaSemanal(tarea.toUpperCase(), vltrigger.toUpperCase(), dias, arregloParametros, "0",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("2")) {
            iniciarTareaDiaMes(tarea.toUpperCase(), vltrigger.toUpperCase(), diames, arregloParametros, "0",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("3")) {
            iniciarTareaIntervaloMinutos(tarea.toUpperCase(), vltrigger.toUpperCase(), horarepeticion,
                    arregloParametros, "0", arregloParamNames(vecreporte[0]));
        } else if (frecuencia.equals("4")) {
            iniciarTareaIntervaloMensual(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "0",
                    arregloParamNames(vecreporte[0]));
        } else {
            ////System.out.println("Iniciando tarea diaria");
            //Definir la instancia del job
            String pparam;
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                    .getRequest();
            String[] chkbox = request.getParameterValues("toDelete");
            if (chkbox == null) {
                pparam = "";
            } else {
                pparam = StringUtils.join(chkbox, ",").replace(" ", "");
            }
            iniciarTareaRepeticion(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "0",
                    arregloParamNames(vecreporte[0]), pparam, hora, minutos);
        }
        //   }
    }

    /**Programa tarea diaria
     * @throws NamingException */
    private void iniciarTareaDiaria(String ptarea, String ptrigger, String paramvalues, String isrecupera,
            String paramnames, int phora, int pminutos) {
        ////System.out.println("Iniciando tarea diaria");
        //Definir la instancia del job
        JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
        //Define el Trigger y la frecuencia en que se va a ejecutar
        Trigger trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                .withSchedule(dailyAtHourAndMinute(phora, pminutos)).build();

        try {
            //Inicia el cronograma         
            schd.scheduleJob(job, trigger);
            schd.start();
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    getMessage("mailtareamsgexito") + " " + ptrigger.toUpperCase(), "");
            if (isrecupera == "0") {
                insert("0", "0", paramvalues, "0", paramnames);
            }
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
            limpiar();
        } catch (SchedulerException | NamingException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);
    }

    /**Programa tarea semanal
     * @throws NamingException */
    private void iniciarTareaSemanal(String ptarea, String ptrigger, String pdias, String paramvalues,
            String isrecupera, String paramnames, int phora, int pminutos) {

        //Definir la instancia del job
        JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
        //Define el Trigger y la frecuencia en que se va a ejecutar
        Trigger trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                .withSchedule(weeklyOnDayAndHourAndMinute(Integer.parseInt(pdias), phora, pminutos)).build();

        try {
            //Inicia el cronograma
            schd.scheduleJob(job, trigger);
            schd.start();
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    getMessage("mailtareamsgexitosemanal") + " " + ptrigger.toUpperCase(), "");
            if (isrecupera == "0") {
                insert(dias, "0", paramvalues, "0", paramnames);
            }
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
            limpiar();
        } catch (SchedulerException | NamingException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);
    }

    /**Programa tarea diaria usando un cron, un da del mes especifico con repeticion
     * @throws NamingException */
    private void iniciarTareaDiaMes(String ptarea, String ptrigger, String pdiames, String paramvalues,
            String isrecupera, String paramnames, int phora, int pminutos) {
        int diames = Integer.parseInt(pdiames);
        //Definir la instancia del job
        JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
        //Define el Trigger y la frecuencia en que se va a ejecutar
        CronTrigger trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                .withSchedule(monthlyOnDayAndHourAndMinute(diames, phora, pminutos)).build();

        try {
            //Inicia el cronograma
            schd.start();
            schd.scheduleJob(job, trigger);
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    getMessage("mailtareamsgexitodiaria") + " " + ptrigger.toUpperCase(), "");
            if (isrecupera == "0") {
                insert(dias, pdiames, paramvalues, "0", paramnames);
            }
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
            limpiar();
        } catch (SchedulerException | NamingException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);
    }

    /**Programa tarea por intervalo mensual puede ser , Mensual, Bimensual o trimestral
     * @throws NamingException */
    private void iniciarTareaIntervaloMensual(String ptarea, String ptrigger, String paramvalues, String isrecupera,
            String paramnames) {

        //Definir la instancia del job
        JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
        //Define el Trigger y la frecuencia en que se va a ejecutar
        Trigger trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                .withSchedule(calendarIntervalSchedule().withIntervalInMonths(1)) // interval is set in calendar months
                .build();

        try {
            //Inicia el cronograma
            schd.scheduleJob(job, trigger);
            schd.start();
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    getMessage("mailtareamsgexitoMesIntervalo") + " " + ptrigger.toUpperCase(), "");
            if (isrecupera == "0") {
                insert(dias, "0", paramvalues, "0", paramnames);
            }
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
            limpiar();
        } catch (SchedulerException | NamingException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);

    }

    /**Programa tarea por intervalo por hora puede ser , Mensual, Bimensual o trimestral
     * @throws NamingException */
    private void iniciarTareaIntervaloMinutos(String ptarea, String ptrigger, String phorarepeticion,
            String paramvalues, String isrecupera, String paramnames) {
        int multiplo = 60;
        int minutos = Integer.parseInt(phorarepeticion) * multiplo;
        //System.out.println(minutos);
        //Definir la instancia del job
        JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
        //Define el Trigger y la frecuencia en que se va a ejecutar
        Trigger trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio)
                .withSchedule(simpleSchedule().withIntervalInSeconds(minutos).repeatForever()).build();

        try {
            //Inicia el cronograma
            schd.scheduleJob(job, trigger);
            schd.start();
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    getMessage("mailtareamsgexitoMinutosIntervalo") + " " + ptrigger.toUpperCase(), "");
            if (isrecupera == "0") {
                insert("0", "0", paramvalues, phorarepeticion, paramnames);
            }
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
            limpiar();
        } catch (SchedulerException | NamingException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);

    }

    /**Programa tarea repeticion
     * @throws NamingException */
    private void iniciarTareaRepeticion(String ptarea, String ptrigger, String paramvalues, String isrecupera,
            String paramnames, String pparam, int phora, int pminutos) {

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                .getRequest();
        String[] chkbox = request.getParameterValues("toDelete");

        ////System.out.println("Iniciando tarea diaria");
        //Definir la instancia del job
        if (chkbox == null) {
            msj = new FacesMessage(FacesMessage.SEVERITY_WARN, getMessage("mailtareaAlert"), "");
        } else {
            String param = StringUtils.join(chkbox, ",").replace(" ", "");
            JobDetail job = newJob(TareaInvocar.class).withIdentity(ptarea.toUpperCase(), "unico").build();
            CronTrigger trigger;
            //Define el Trigger y la frecuencia en que se va a ejecutar
            if (isrecupera == "0") {
                trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                        .withSchedule(cronSchedule("0 " + pminutos + " " + phora + " " + " ? * " + param + " *"))
                        .build();
            } else {
                trigger = newTrigger().withIdentity(ptrigger.toUpperCase(), "unico").startAt(diainicio) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
                        .withSchedule(cronSchedule("0 " + pminutos + " " + phora + " " + " ? * " + pparam + " *"))
                        .build();
            }
            //System.out.println("0 " + pminutos + " " + phora + " "+ " ? * " + pparam + " *");
            try {
                //Inicia el cronograma
                schd.scheduleJob(job, trigger);
                schd.start();
                msj = new FacesMessage(FacesMessage.SEVERITY_INFO,
                        getMessage("mailtareamsgexito") + " " + ptrigger.toUpperCase(), "");
                if (isrecupera == "0") {
                    insert("0", "0", paramvalues, "0", paramnames);
                }
                deleteTemps(session, "bvtparams_temp");
                deleteTemps(session, "bvtparams_number_temp");
                //limpiar();
            } catch (SchedulerException | NamingException e) {
                e.printStackTrace();
                msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, msj);
    }

    /*
    /**Programa tarea repeticion por hora
     * @throws NamingException 
    private void iniciarTareaRepeticionHora(String ptarea, String ptrigger, String phora, String pminuto, String phorarepeticion, String paramvalues, String isrecupera, String paramnames, String pparam){
           
       //Creamos la instancia calendario para separar en dia, mes y ao la fecha seleccionada
      Calendar cal = Calendar.getInstance();
      cal.setTime(diainicio);
      int anio = cal.get(Calendar.YEAR);
      int vmes = cal.get(Calendar.MONTH); //Para iniciar meses comenzando desde enero = 0
      int dia = cal.get(Calendar.DAY_OF_MONTH);
          
       HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
       String[] chkbox = request.getParameterValues("toDelete");
           
       //System.out.println(param);
           
       ////System.out.println("Iniciando tarea diaria");
    //Definir la instancia del job
       if (chkbox==null){
      msj = new FacesMessage(FacesMessage.SEVERITY_WARN, getMessage("mailtareaAlert"), "");
       } else {
       String param = StringUtils.join(chkbox, ",").replace(" ", "");
       JobDetail job = newJob(TareaInvocar.class)
         .withIdentity(ptarea.toUpperCase(), "unico")
         .build();
       CronTrigger trigger;
       //Define el Trigger y la frecuencia en que se va a ejecutar
       if(isrecupera=="0"){
         trigger = newTrigger()
          .withIdentity(ptrigger.toUpperCase(), "unico")
          .startAt(dateOf(Integer.parseInt(phora), //Hora de inicio
                    Integer.parseInt(pminuto), //Minutos de inicio
                    00, //Segundos de inicio
                    dia, //Dia de inicio
                    vmes, //Mes de Inicio
                    anio)) //Ao de inicio,Get a Date object that represents the given time, on the  given date.
          .withSchedule(cronSchedule("0 0/"+Integer.parseInt(phorarepeticion)*60 +"  0 "+ " ? * " + param + ""))
          .build();
       } else {
        trigger = newTrigger()
              .withIdentity(ptrigger.toUpperCase(), "unico")
              .startNow()
              .withSchedule(cronSchedule("0 0/"+Integer.parseInt(phorarepeticion)*60 +"  0 "+ " ? * " + param + ""))
              .build();   
       }
    //System.out.println("0 " + pminuto + " " + phora + " "+ " * * " + param + "");
       try {
      //Inicia el cronograma
     schd.start();
     schd.scheduleJob(job, trigger);
     msj = new FacesMessage(FacesMessage.SEVERITY_INFO, getMessage("mailtareamsgexito") + " " + ptrigger.toUpperCase(), "");
     if(isrecupera=="0"){
     insert("0", "0", paramvalues, "0", paramnames);
     }
     deleteTemps(session, "bvtparams_temp");
     deleteTemps(session, "bvtparams_number_temp");
     limpiar();
       } catch (SchedulerException | NamingException e) {
     e.printStackTrace();
     msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
      }
       }
       FacesContext.getCurrentInstance().addMessage(null, msj);
    }*/

    /**Borra la tarea
     * @throws NamingException */
    public void detenerTarea() throws NamingException {
        try {
            //schd.unscheduleJob(triggerKey(vltrigger.toUpperCase(), "unico")); 
            schd.deleteJob(jobKey(vltrigger.toUpperCase(), "unico"));//Reimplementacin, anteriormente solo la quitaba de la tarea no la borraba
            //Nuevo cambio 20/09/2014
            delete();
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO, getMessage("mailtareaborrada"), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        } catch (SchedulerException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        }
    }

    /**Detiene la tarea
     * @throws NamingException */
    public void pararTarea() throws NamingException {
        try {
            schd.deleteJob(jobKey(vltrigger.toUpperCase(), "unico"));
            updateJobStatusBd(vltrigger.toUpperCase(), "1");
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO, getMessage("mailtareadetenida"), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        } catch (SchedulerException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        }
    }

    /**Reinicia la tarea
     * @throws NamingException */
    public void reiniciarTarea() throws NamingException {

        String[] vecreporte = reporte.split("\\ - ", -1);
        arregloParametros = StringUtils.join(inputs, "|").toUpperCase();

        //Actualiza el estatus
        updateJobStatusBd(vltrigger.toUpperCase(), "0");

        //Creamos la instancia calendario para separar en dia, mes y ao la fecha seleccionada
        Calendar cal = Calendar.getInstance();
        cal.setTime(diainicio);
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minutos = cal.get(Calendar.MINUTE); //Para iniciar meses comenzando desde enero = 0

        if (frecuencia.equals("0")) {
            iniciarTareaDiaria(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("1")) {
            iniciarTareaSemanal(tarea.toUpperCase(), vltrigger.toUpperCase(), dias, arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("2")) {
            iniciarTareaDiaMes(tarea.toUpperCase(), vltrigger.toUpperCase(), diames, arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("3")) {
            iniciarTareaIntervaloMinutos(tarea.toUpperCase(), vltrigger.toUpperCase(), horarepeticion,
                    arregloParametros, "1", arregloParamNames(vecreporte[0]));
        } else if (frecuencia.equals("4")) {
            iniciarTareaIntervaloMensual(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]));
        } else {
            iniciarTareaRepeticion(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), "0", hora, minutos);
        }

    }

    /**Detiene la tarea para recargarla
     * Usada en el mtodo iniar tarea
     * @throws NamingException */
    /*
    private void detenerTarea_Recargar() throws NamingException  {
       try {
       //schd.unscheduleJob(triggerKey(vltrigger.toUpperCase(), "unico")); 
       schd.deleteJob(jobKey(vltrigger.toUpperCase(), "unico"));//Reimplementacin, anteriormente solo la quitaba de la tarea no la borraba
                                           //Nuevo cambio 20/09/2014
       delete();
       //msj = new FacesMessage(FacesMessage.SEVERITY_INFO, getMessage("mailtareaborrada"), "");
       //FacesContext.getCurrentInstance().addMessage(null, msj);
    } catch (SchedulerException e) {
       e.printStackTrace();
       //msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
      //FacesContext.getCurrentInstance().addMessage(null, msj);
    }    
    }*/

    /**Si el servidor se reinicia o la tarea no est activa se inicia desde los 
     * registros de la base de datos
    * @throws SchedulerException
    * @throws NamingException 
    * @throws IOException **/
    protected void recuperarTriggers(String estatus) throws SchedulerException, NamingException {
        //System.out.println("Recuperando Tareas");
        consulta.selectPntGenerica(
                "select job, disparador, grupo, diasem,  frecuencia, diames, PARAMVALUES, paramnames, intervalo, dias_semana, to_char(diainicio,'HH24'), to_char(diainicio,'mi') from t_programacion where activa = '"
                        + estatus + "' order by disparador",
                JNDI);
        int rows = consulta.getRows();
        String[][] vltabla = consulta.getArray();

        if (rows > 0) {//Si la consulta es mayor a cero comienza a recorrerla para verificar si la tarea existe en ram, si no la reactiva
                       //desde la base de datos
            for (int i = 0; i < rows; i++) {//Recorre los triggers almacenados y verifica por cada uno
                if (schd.checkExists(triggerKey(vltabla[i][1].toUpperCase(), "unico")) == false) {//Si la tarea no existe la crea
                    //Opcin para generar la tarea diaria
                    if (vltabla[i][4].toString().equals("0")) {
                        //Tarea diaria
                        iniciarTareaDiaria(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(), vltabla[i][6],
                                "1", vltabla[i][7], Integer.parseInt(vltabla[i][10]),
                                Integer.parseInt(vltabla[i][11]));
                    } else if (vltabla[i][4].toString().equals("1")) {//Fin valida que sea diaria, de lo contrario es semanal
                        //Tarea semanal
                        iniciarTareaSemanal(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(), vltabla[i][3],
                                vltabla[i][6], "1", vltabla[i][7], Integer.parseInt(vltabla[i][10]),
                                Integer.parseInt(vltabla[i][11]));
                    } else if (vltabla[i][4].toString().equals("2")) {
                        //Tarea dia mes
                        iniciarTareaDiaMes(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(), vltabla[i][5],
                                vltabla[i][6], "1", vltabla[i][7], Integer.parseInt(vltabla[i][10]),
                                Integer.parseInt(vltabla[i][11]));
                    } else if (vltabla[i][4].toString().equals("3")) {
                        //Tarea dia hora
                        //System.out.println("Recuperando Tareas minutos");
                        iniciarTareaIntervaloMinutos(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(),
                                vltabla[i][8], vltabla[i][6], "1", vltabla[i][7]);
                    } else if (vltabla[i][4].toString().equals("4")) {
                        //Intervalos mensuales
                        iniciarTareaIntervaloMensual(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(),
                                vltabla[i][6], "1", vltabla[i][7]);
                    } else {
                        //Repticin
                        iniciarTareaRepeticion(vltabla[i][0].toUpperCase(), vltabla[i][1].toUpperCase(),
                                vltabla[i][6], "1", vltabla[i][7], vltabla[i][10], Integer.parseInt(vltabla[i][10]),
                                Integer.parseInt(vltabla[i][11]));
                    }
                } //Fin de chequeo de tarea en ram
            } //Fin del recorrido
        }
    }

    public void limpiar() {
        reporte = "";
        tarea = ""; //Nombre de la tarea
        vltrigger = ""; //Nombre del disparador
        diasemana = ""; //Da de la semana
        frecuencia = "0"; //Fercuencia de repeticin
        dias = "2"; // Das de repeticin del reporte
        idgrupo = "";
        asunto = "";
        contenido = "";
        diames = "1";
        diainicio = new Date();
        inputs = null;
        //ruta_salida = "URL";
    }

    //Coneccion a base de datos
    //Pool de conecciones JNDIFARM
    Connection con;
    PreparedStatement pstmt = null;
    ResultSet r;

    /**
     * Inserta Configuracin.
     * Parametros del Metodo: String codpai, String despai. Pool de conecciones y login
      * @throws NamingException 
     **/
    private void delete() throws NamingException {

        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);

            con = ds.getConnection();

            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            String productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin

            String vlfecha;
            java.text.SimpleDateFormat sdfecha_es = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm", locale);
            java.text.SimpleDateFormat sdfecha_en = new java.text.SimpleDateFormat("dd/MMM/yyyy HH:mm", locale);
            String to_date;
            if (OPENBIZVIEW_BD_LANG.equals("es")) {
                vlfecha = sdfecha_es.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mm/yyyy hh24:mi')";
            } else {
                vlfecha = sdfecha_en.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mon/yyyy hh24:mi')";
            }

            String query = "";

            switch (productName) {
            case "Oracle":
                query = "DELETE  from T_PROGRAMACION WHERE diainicio = " + to_date + " and disparador = '"
                        + vltrigger.toUpperCase() + "' and instancia = '" + instancia + "'";
                break;
            case "PostgreSQL":
                query = "DELETE  from T_PROGRAMACION WHERE diainicio = '" + diainicio + "' and disparador = '"
                        + vltrigger.toUpperCase() + "' and instancia = '" + instancia + "'";
                break;
            }

            //System.out.println(query);
            pstmt = con.prepareStatement(query);

            try {
                pstmt.executeUpdate();
                limpiar();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Inserta Configuracin.
     * 
      * @throws NamingException 
     **/
    private void insert(String pdias, String pdiames, String paramvalues, String intervalo, String paramnames) {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            String productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin

            String[] vecidgrupo = idgrupo.split("\\ - ", -1);

            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                    .getRequest();
            String[] chkbox = request.getParameterValues("toDelete");
            String param = "";
            //System.out.println(param);

            ////System.out.println("Iniciando tarea diaria");
            //Definir la instancia del job
            if (chkbox == null) {
                param = "";
            } else {
                param = StringUtils.join(chkbox, ",").replace(" ", "");
            }
            //System.out.println(param);
            String[] vecreporte = reporte.split("\\ - ", -1);
            String vlfecha;
            java.text.SimpleDateFormat sdfecha_es = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm", locale);
            java.text.SimpleDateFormat sdfecha_en = new java.text.SimpleDateFormat("dd/MMM/yyyy HH:mm", locale);
            String to_date;
            if (OPENBIZVIEW_BD_LANG.equals("es")) {
                vlfecha = sdfecha_es.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mm/yyyy hh24:mi')";
            } else {
                vlfecha = sdfecha_en.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mon/yyyy hh24:mi')";
            }

            String query = "";

            switch (productName) {
            case "Oracle":
                query = "INSERT INTO T_PROGRAMACION VALUES (?,?,?,?,?,?,?,?,?,?,?,?," + to_date
                        + ",?,?,?,?,?,?,?,?,?)";
                break;
            case "PostgreSQL":
                query = "INSERT INTO T_PROGRAMACION VALUES (?,?,?,?,?,?,?,?,?,?,?,?,'" + diainicio
                        + "',?,?,?,?,?,?,?,?,?)";
                break;
            }

            //System.out.println(query);
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, vltrigger.toUpperCase());
            pstmt.setString(2, "unico");
            pstmt.setInt(3, Integer.parseInt(pdias));
            pstmt.setString(4, frecuencia);
            pstmt.setString(5, asunto);
            pstmt.setString(6, contenido);
            pstmt.setString(7, vecreporte[0].toUpperCase());
            pstmt.setString(8, BIRT_VIEWER_WORKING_FOLDER);
            pstmt.setString(9, BIRT_VIEWER_LOG_DIR);
            pstmt.setInt(10, Integer.parseInt(vecidgrupo[0]));
            pstmt.setString(11, tarea.toUpperCase());
            pstmt.setString(12, pdiames);
            pstmt.setString(13, "0");
            pstmt.setString(14, paramvalues);
            pstmt.setInt(15, Integer.parseInt(intervalo));
            pstmt.setString(16, paramnames);
            pstmt.setString(17, ruta_salida);
            pstmt.setString(18, opctareas);
            pstmt.setString(19, formato);
            pstmt.setInt(20, Integer.parseInt(instancia));
            pstmt.setString(21, param);

            try {
                pstmt.executeUpdate();
                limpiar();
            } catch (SQLException e) {
                //e.printStackTrace();
                msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
                FacesContext.getCurrentInstance().addMessage(null, msj);
            }

            pstmt.close();
            con.close();
        } catch (Exception e) {
            //e.printStackTrace();
        }
    }

    /**
     * Leer Datos de mailconfig
     * @throws NamingException 
     * @throws IOException 
     **/
    public void select(int first, int pageSize, String sortField, Object filterValue)
            throws SQLException, NamingException {
        try {

            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            String productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin   

            String query = "";

            if (opctareas == null) {
                opctareas = "1";
            }

            if (mailreporteFiltro == null) {
                mailreporteFiltro = " - ";
            }

            if (mailfrecuenciaFiltro == null) {
                mailfrecuenciaFiltro = " - ";
            }

            if (mailgrupoFiltro == null) {
                mailgrupoFiltro = " - ";
            }

            String[] vecrepf = mailreporteFiltro.split("\\ - ", -1);
            String[] veccfrecf = mailfrecuenciaFiltro.split("\\ - ", -1);
            String[] vecgrupf = mailgrupoFiltro.split("\\ - ", -1);

            switch (productName) {
            case "Oracle":
                query += "  select * from ";
                query += " ( select query.*, rownum as rn from";
                query += " ( select trim(a.job), trim(a.disparador),  case a.frecuencia when '0' then '"
                        + getMessage("mailtareaDiario").toUpperCase() + "' when  '1' then '"
                        + getMessage("mailtareaSemanal").toUpperCase() + "' when '2' then'"
                        + getMessage("mailtareaPersonalizada").toUpperCase() + "' when '3' then '"
                        + getMessage("mailtareaHoraRep").toUpperCase() + "' when '4' then '"
                        + getMessage("mailimes1").toUpperCase() + "' when '5' then '"
                        + getMessage("maillidiasSelect").toUpperCase() + "'  else '"
                        + getMessage("maillidiasSelect1").toUpperCase() + "' end , a.diasem";
                query += " , trim(a.codrep),  trim(a.idgrupo), trim(a.asunto), trim(a.contenido), trim(b.desgrupo) , trim(a.frecuencia), trim(a.diames), trim(to_char(a.diainicio, 'dd/mm/yyyy HH24:mi')), decode(trim(activa),'0','chkActiva','chkInactiva'), trim(activa), decode(trim(activa),'0','"
                        + getMessage("mailtarea0") + "','" + getMessage("mailtarea1") + "'), trim(a.formato)";
                query += " , case when activa = '0' then 'fa fa-circle fa-2x text-success' else 'fa fa-circle fa-2x text-danger' end, trim(paramvalues), intervalo";
                query += " from t_programacion a, mailgrupos b";
                query += " where a.idgrupo=b.idgrupo";
                query += " and A.instancia=B.instancia";
                query += " and a.job||a.codrep like '%" + ((String) filterValue).toUpperCase() + "%'";
                query += " and a.codrep like '" + vecrepf[0] + "%'";
                query += " and a.frecuencia like '" + veccfrecf[0] + "%'";
                query += " and a.idgrupo like '" + vecgrupf[0] + "%'";
                query += " AND   a.instancia = '" + instancia + "'";
                query += " order by " + sortField.replace("v", "") + ") query";
                query += " ) where rownum <= " + pageSize;
                query += " and rn > (" + first + ")";
                break;
            case "PostgreSQL":
                query = "select trim(a.job), trim(a.disparador),   case a.frecuencia when '0' then '"
                        + getMessage("mailtareaDiario").toUpperCase() + "' when  '1' then '"
                        + getMessage("mailtareaSemanal").toUpperCase() + "' when '2' then'"
                        + getMessage("mailtareaPersonalizada").toUpperCase() + "' when '3' then '"
                        + getMessage("mailtareaHoraRep").toUpperCase() + "' when '4' then '"
                        + getMessage("mailimes1").toUpperCase() + "' when '5' then '"
                        + getMessage("maillidiasSelect").toUpperCase() + "'  else '"
                        + getMessage("maillidiasSelect1").toUpperCase() + "' end , a.diasem";
                query += " , trim(a.codrep),  trim(cast(a.idgrupo as text)), trim(a.asunto), trim(a.contenido), trim(b.desgrupo) , trim(a.frecuencia), trim(a.diames), trim(to_char(a.diainicio, 'dd/mm/yyyy hh24:mi')),  case when trim(activa) = '0' then 'chkActiva' else 'chkInactiva' end, trim(activa), case when trim(activa) = '0' then '"
                        + getMessage("mailtarea0") + "' else '" + getMessage("mailtarea1")
                        + "' end, trim(a.formato)";
                query += " , case when activa = '0' then 'fa fa-circle fa-2x text-success' else 'fa fa-circle fa-2x text-danger' end, trim(paramvalues), intervalo";
                query += " from t_programacion a, mailgrupos b";
                query += " where a.idgrupo=b.idgrupo";
                query += " and A.instancia=B.instancia";
                query += " and a.job||a.codrep like '%" + ((String) filterValue).toUpperCase() + "%'";
                query += " and a.codrep like '" + vecrepf[0] + "%'";
                query += " and a.frecuencia like '" + veccfrecf[0] + "%'";
                query += " and cast(a.idgrupo as text) like '" + vecgrupf[0] + "%'";
                query += " and a.disparador like '" + vltrigger + "%'";
                query += " AND   a.instancia = '" + instancia + "'";
                query += " order by " + sortField.replace("v", "");
                query += " LIMIT " + pageSize;
                query += " OFFSET " + first;
                break;
            }

            pstmt = con.prepareStatement(query);
            //System.out.println(query);

            r = pstmt.executeQuery();

            while (r.next()) {
                Programacion select = new Programacion();
                select.setVjob(r.getString(1));
                select.setVdisparador(r.getString(2));
                select.setVfrecuenciades(r.getString(3));
                select.setVdiasem(r.getString(4));
                select.setVcodrep(r.getString(5));
                select.setVidgrupo(r.getString(6));
                select.setVasunto(r.getString(7));
                select.setVcontenido(r.getString(8));
                select.setViddesidgrupo(r.getString(9));
                select.setVfrecuencia(r.getString(10));
                select.setVdiames(r.getString(11));
                select.setVdiainicio(r.getString(12));
                select.setClase(r.getString(13));
                select.setActiva(r.getString(14));
                select.setVactivadetalletb(r.getString(15));
                select.setVformato(r.getString(16).toUpperCase());
                select.setStatusIncon(r.getString(17));
                select.setVparamvalues(r.getString(18));
                select.setVintervalo(r.getString(19));
                //Agrega la lista
                list.add(select);
                rows = list.size();

            }
        } catch (SQLException | SchedulerException e) {
            e.printStackTrace();
        }
        //Cierra las conecciones
        pstmt.close();
        con.close();
        r.close();

    }

    /**
    * Leer registros en la tabla
    * @throws NamingException 
    * @throws IOException 
    **/
    public void counter(Object filterValue) throws SQLException, NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();
            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin

            String query = "";

            if (mailreporteFiltro == null) {
                mailreporteFiltro = " - ";
            }

            if (mailfrecuenciaFiltro == null) {
                mailfrecuenciaFiltro = " - ";
            }

            if (mailgrupoFiltro == null) {
                mailgrupoFiltro = " - ";
            }

            String[] vecrepf = mailreporteFiltro.split("\\ - ", -1);
            String[] veccfrecf = mailfrecuenciaFiltro.split("\\ - ", -1);
            String[] vecgrupf = mailgrupoFiltro.split("\\ - ", -1);

            switch (productName) {
            case "Oracle":
                query = "SELECT count_programacion('" + ((String) filterValue).toUpperCase() + "','" + instancia
                        + "','" + vecrepf[0] + "','" + veccfrecf[0] + "','" + vecgrupf[0] + "') from dual";
                break;
            case "PostgreSQL":
                query = "SELECT count_programacion('" + ((String) filterValue).toUpperCase() + "','" + instancia
                        + "','" + vecrepf[0] + "','" + veccfrecf[0] + "','" + vecgrupf[0] + "')";
                break;
            }

            //System.out.println(query);
            pstmt = con.prepareStatement(query);

            r = pstmt.executeQuery();

            while (r.next()) {
                rows = r.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //Cierra las conecciones
        pstmt.close();
        con.close();
        r.close();

    }

    /**En caso que se requiera envia correos manualmente al grupo
     * @throws IOException **/

    public void enviarMailmanual() throws IOException {

        java.sql.Date sqlDate = new java.sql.Date(fechadia.getTime());
        //Para reportes
        int rowsrep;
        String[][] vltablarep;

        try {
            String vlqueryRep = "select trim(codrep), trim(rutarep), trim(rutatemp), trim(disparador), trim(formato), to_char(diainicio,'HH24:mi'), case when trim(paramnames) is null then '0' else trim(paramnames) end, case when trim(paramvalues) is null then '0' else trim(paramvalues) end, trim(asunto), trim(contenido), trim(dias_semana)";
            vlqueryRep += " from t_programacion";
            vlqueryRep += " where disparador='" + vltrigger.toUpperCase() + "'";
            //System.out.println(vlqueryRep);   

            consulta.selectPntGenerica(vlqueryRep, JNDI);

            ////System.out.println("select nombrereporte, idgrupo, trim(rutareporte), trim(rutatemp) from mailtarea where hora='" + formato.format(new Date()) + "'");

            rowsrep = consulta.getRows();
            vltablarep = consulta.getArray();

            //Imprime reporte
            if (rowsrep > 0) {//Si la consulta es mayor a cero devuelve registros enva el correo

                new RunReport().outReporteRecibo(vltablarep[0][0].toString(), vltablarep[0][4].toString(),
                        vltablarep[0][1].toString(), vltablarep[0][2].toString(), vltablarep[0][0].toString(),
                        sqlDate, vltablarep[0][3].toString(), vltablarep[0][6].toString(),
                        vltablarep[0][7].toString());

                for (int i = 0; i < rowsrep; i++) {
                    new Sendmail().mailthread(vltrigger.toUpperCase(), vltablarep[i][2], vltablarep[i][0],
                            vltablarep[i][8], vltablarep[i][9], vltablarep[i][4]);
                }
            }
            msj = new FacesMessage(FacesMessage.SEVERITY_INFO, getMessage("mailtareaEnvo1"), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    /**Cambia estatus en la base de datos a la tarea como inactiva
    * @throws NamingException */
    private void updateJobStatusBd(String ptrigger, String estatus) {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);

            con = ds.getConnection();

            String query = "UPDATE t_programacion";
            query += " SET activa = '" + estatus + "'";
            query += " WHERE disparador = '" + ptrigger.toUpperCase() + "'";
            query += " AND   instancia = '" + instancia + "'";
            //System.out.println(query);
            pstmt = con.prepareStatement(query);
            // Antes de ejecutar valida si existe el registro en la base de Datos.
            pstmt.executeUpdate();
            //Cierra conecciones
            pstmt.close();
            con.close();
        } catch (SQLException | NamingException e) {
            e.printStackTrace();
        }
    }

    /**Actualiza job existente
     * Elimina y vuelve a crear
    * @throws NamingException */
    public void updateExistingJob() throws NamingException {
        //Vuelve a crear la tarea
        if (ruta_salida == null) {
            ruta_salida = "";
        }
        String[] vecreporte = reporte.split("\\ - ", -1);
        String[] vecidgrupo = idgrupo.split("\\ - ", -1);

        //Elimina lo existente
        try {
            //schd.unscheduleJob(triggerKey(vltrigger.toUpperCase(), "unico")); 
            schd.deleteJob(jobKey(vltrigger.toUpperCase(), "unico"));//Reimplementacin, anteriormente solo la quitaba de la tarea no la borraba
            //Nuevo cambio 20/09/2014
            //System.out.println("Detiene a: " + vltrigger.toUpperCase());
            //Modifica los valores
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);

            con = ds.getConnection();

            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            String productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin

            arregloParametros = StringUtils.join(inputs, "|").toUpperCase();

            String vlfecha;
            java.text.SimpleDateFormat sdfecha_es = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm", locale);
            java.text.SimpleDateFormat sdfecha_en = new java.text.SimpleDateFormat("dd/MMM/yyyy HH:mm", locale);
            String to_date;
            if (OPENBIZVIEW_BD_LANG.equals("es")) {
                vlfecha = sdfecha_es.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mm/yyyy hh24:mi')";
            } else {
                vlfecha = sdfecha_en.format(diainicio);
                to_date = "to_date('" + vlfecha + "', 'dd/mon/yyyy hh24:mi')";
            }

            String query = "";

            switch (productName) {
            case "Oracle":
                query = "UPDATE t_programacion";
                query += " SET diasem = '" + dias + "'";
                query += " , frecuencia = '" + frecuencia + "'";
                query += " , asunto = '" + asunto + "'";
                query += " , contenido = '" + contenido + "'";
                query += " , codrep = '" + vecreporte[0].toUpperCase() + "'";
                query += " , idgrupo = '" + Integer.parseInt(vecidgrupo[0]) + "'";
                query += " , diames = '" + diames + "'";
                query += " , diainicio = " + to_date;
                query += " , paramvalues = '" + arregloParametros + "'";
                query += " , intervalo = '" + horarepeticion + "'";
                query += " , paramnames = '" + arregloParamNames(vecreporte[0]) + "'";
                query += " , ruta_salida = '" + ruta_salida + "'";
                query += " , opctareas = '" + opctareas + "'";
                query += " , formato = '" + formato + "'";
                query += " WHERE disparador = '" + vltrigger.toUpperCase() + "'";
                query += " AND   instancia = '" + instancia + "'";
                break;
            case "PostgreSQL":
                query = "UPDATE t_programacion";
                query += " SET diasem = '" + dias + "'";
                query += " , frecuencia = '" + frecuencia + "'";
                query += " , asunto = '" + asunto + "'";
                query += " , contenido = '" + contenido + "'";
                query += " , codrep = '" + vecreporte[0].toUpperCase() + "'";
                query += " , idgrupo = '" + Integer.parseInt(vecidgrupo[0]) + "'";
                query += " , diames = '" + diames + "'";
                query += " , diainicio = '" + diainicio + "'";
                query += " , paramvalues = '" + arregloParametros + "'";
                query += " , intervalo = '" + horarepeticion + "'";
                query += " , paramnames = '" + arregloParamNames(vecreporte[0]) + "'";
                query += " , ruta_salida = '" + ruta_salida + "'";
                query += " , opctareas = '" + opctareas + "'";
                query += " , formato = '" + formato + "'";
                query += " WHERE disparador = '" + vltrigger.toUpperCase() + "'";
                query += " AND   instancia = '" + instancia + "'";
                break;
            }

            // System.out.println(query);
            pstmt = con.prepareStatement(query);
            // Antes de ejecutar valida si existe el registro en la base de Datos.
            pstmt.executeUpdate();
            //Cierra conecciones

            pstmt.close();
            con.close();
        } catch (SchedulerException | SQLException e) {
            e.printStackTrace();
            msj = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
            FacesContext.getCurrentInstance().addMessage(null, msj);
        }

        //Creamos la instancia calendario para separar en dia, mes y ao la fecha seleccionada
        Calendar cal = Calendar.getInstance();
        cal.setTime(diainicio);
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minutos = cal.get(Calendar.MINUTE); //Para iniciar meses comenzando desde enero = 0

        //Incia tarea
        if (frecuencia.equals("0")) {
            iniciarTareaDiaria(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("1")) {
            iniciarTareaSemanal(tarea.toUpperCase(), vltrigger.toUpperCase(), dias, arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("2")) {
            iniciarTareaDiaMes(tarea.toUpperCase(), vltrigger.toUpperCase(), diames, arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), hora, minutos);
        } else if (frecuencia.equals("3")) {
            iniciarTareaIntervaloMinutos(tarea.toUpperCase(), vltrigger.toUpperCase(), horarepeticion,
                    arregloParametros, "1", arregloParamNames(vecreporte[0]));
        } else if (frecuencia.equals("4")) {
            iniciarTareaIntervaloMensual(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]));
        } else {
            iniciarTareaRepeticion(tarea.toUpperCase(), vltrigger.toUpperCase(), arregloParametros, "1",
                    arregloParamNames(vecreporte[0]), "0", hora, minutos);
        }
        //System.out.println("fin");
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////PARAMETROS DEL REPORTE///////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    private List<String> listR = new ArrayList<String>();//Guarda el nombre que se va a mostrar en la pantalla
    private List<String> listPN = new ArrayList<String>();//Guarda el nombre del parmetro
    private List<Integer> listPT = new ArrayList<Integer>();//Guarda el tipo del parmetro
    private List<Boolean> listPH = new ArrayList<Boolean>();//Guarda si el parametro es hidden
    private List<Boolean> listPR = new ArrayList<Boolean>();//Guarda si el parametro es requerido
    private String[] inputs;
    private int rowsParam;

    /**
     * @return the inputs
     */
    public String[] getInputs() {
        return inputs;
    }

    /**
     * @param inputs the inputs to set
     */
    public void setInputs(String[] inputs) {
        this.inputs = inputs;
    }

    /**
     * @return the listR
     */
    public List<String> getListR() {
        return listR;
    }

    /**
     * @param listR the listR to set
     */
    public void setListR(List<String> listR) {
        this.listR = listR;
    }

    /**
     * Retorna la ruta real del reporte 
     * y se lo asigna al mtodo ReadParamsBirtReport
     * de la clase RunReport, el mismo leer los parmetros
     * del reporte parra programar la tarea
     */
    public String getRutaRepReal() {
        //String ruta = extContext.getRealPath(RUTA_REPORTE) + File.separator + reporte.split(" - ")[0].toUpperCase() + ".rptdesign";
        String ruta = BIRT_VIEWER_WORKING_FOLDER + File.separator + reporte.split(" - ")[0].toUpperCase()
                + ".rptdesign";
        //System.out.println(ruta);
        return ruta;
    }

    /**
       * Lee parmetros del los reportes
       * Usa el API del birt report, Iterando los parmetros
       * y guardando los valores en un ArrayList
       * @param: Ruta, la ruta fsica de ubicacin del reporte
       */
    public void ReadParamsBirtReport(String preporte) {
        //Borra todo lo que contenga la session
        try {
            deleteTemps(session, "bvtparams_temp");
            deleteTemps(session, "bvtparams_number_temp");
        } catch (NamingException e1) {

            e1.printStackTrace();
        }

        //Lectura de parmetros de reportes, BIRT ENGINE
        //
        EngineConfig config = new EngineConfig();
        ReportEngine engine = new ReportEngine(config);
        //Open a report design 
        IReportRunnable design = null;
        try {
            design = engine.openReportDesign(preporte);
        } catch (EngineException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask(design);
        @SuppressWarnings("rawtypes")
        Collection params = task.getParameterDefns(true);

        @SuppressWarnings("rawtypes")
        Iterator iter = params.iterator();
        //Iterate over all parameters
        while (iter.hasNext()) {
            IParameterDefn param = (IParameterDefn) iter.next();
            listPN.add(param.getName());//Guarda el nombre del parmetro
            listPT.add(param.getDataType());//Guarda el tipo de parmetro
            listPH.add(param.isHidden());//Indica si es hidden
            listPR.add(param.isRequired());
            {
                if (param.getPromptText() == null) {
                    listR.add(param.getName());
                } else {
                    listR.add(param.getPromptText());
                }
                rowsParam = params.size();

            }
        }
        //Una vez obtenido los parmetros los guardamos en una tabla temporal
        //Esto permite hace un mejor manejo en el for each loop al momento de insertar los valores
        //Recorre la lista y va insertando, blanquea la tabla antes de cargarla
        //
        for (int i = 0; i < rowsParam; i++) {
            //System.out.println(listPH.get(i));
            try {
                //Inserta parmetros 
                deleteParam(reporte.split(" - ")[0].toUpperCase(), listPN.get(i), listPT.get(i), session);//Borra temporal
                insertParam(reporte.split(" - ")[0].toUpperCase(), listPN.get(i), listPT.get(i), session,
                        listR.get(i), listPH.get(i).toString(), listPR.get(i).toString());//CArga temporal
                //Inserta el nmero de parmetros
                deleteParamNumber(reporte.split(" - ")[0].toUpperCase(), session);
                insertParamNumber(reporte.split(" - ")[0].toUpperCase(), session, rowsParam);
            } catch (NamingException e) {

                e.printStackTrace();
            }
        }
        task.close();

        //Lectura de datos en la tabla posteriormente recorre el arreglo para impimir en pantalla
        //
        String[] vecreporte = reporte.split("\\ - ", -1);
        String vlquery = "select promptext from bvtparams_temp where sessionid = '" + session + "' and codrep = '"
                + vecreporte[0].toUpperCase() + "' and paramhidden = 'false' and paramrequired = 'true'";
        try {
            consulta.selectPntGenerica(vlquery, JNDI);
            rowsParam = consulta.getRows();

        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        inputs = new String[rowsParam];//Asigna el tamao a los inputs
        //Si hay registros en la temporal recorre la tabla 
        if (rowsParam > 0) {//Si hay registros muestra los parmetros                 
            vlTabla = consulta.getArray();
            RequestContext.getCurrentInstance().execute("PF('dlg2').show()");
        }
    }

    /**
    * Inserta Temporal de parametros.
    * <p>
    **/
    private void insertParam(String codrep, String paramName, Integer paramType, String sessionId, String promptext,
            String phidden, String prequired) throws NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            String query = "INSERT INTO bvtparams_temp VALUES (?,?,?,?,?,?,?)";
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, codrep.toUpperCase());
            pstmt.setString(2, paramName);
            pstmt.setInt(3, paramType);
            pstmt.setString(4, sessionId);
            pstmt.setString(5, promptext.toUpperCase());
            pstmt.setString(6, phidden);
            pstmt.setString(7, prequired);
            ////System.out.println(query);
            try {
                //Avisando
                pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    * Borra Temporal de parametros.
    * <p>
    **/
    private void deleteParam(String codrep, String paramName, Integer paramType, String sessionId)
            throws NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            String query = "delete from bvtparams_temp where codrep = ? and paramname = ? and paramtype = ? and sessionid = ?";
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, codrep.toUpperCase());
            pstmt.setString(2, paramName.toUpperCase());
            pstmt.setInt(3, paramType);
            pstmt.setString(4, sessionId);

            ////System.out.println(query);
            try {
                //Avisando
                pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    * Inserta Temporal de parametros.
    * <p>
    **/
    private void insertParamNumber(String codrep, String sessionId, Integer paramnumber) throws NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            String query = "INSERT INTO bvtparams_number_temp VALUES (?,?,?)";
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, codrep.toUpperCase());
            pstmt.setString(2, sessionId);
            pstmt.setInt(3, paramnumber);

            ////System.out.println(query);
            try {
                //Avisando
                pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    * Borra Temporal de parametros.
    * <p>
    **/
    private void deleteParamNumber(String codrep, String sessionId) throws NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            String query = "delete from bvtparams_number_temp where codrep = ? and sessionid = ?";
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, codrep.toUpperCase());
            pstmt.setString(2, sessionId);

            ////System.out.println(query);
            try {
                //Avisando
                pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    * Borra Temporal de parametros.
    * <p>
    **/
    private void deleteTemps(String sessionId, String tabla) throws NamingException {
        try {
            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            String query = "delete from " + tabla + " where sessionid = '" + sessionId + "'";
            pstmt = con.prepareStatement(query);
            //System.out.println(sessionId);
            try {
                //Avisando
                pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    * Retorna el nmero de parmetros
    * <p>
    **/
    public Integer paramsNumber(String reporte) {
        Integer param = 0;
        int vlrows = 0;
        String vlquery = "select paramnumber from bvtparams_number_temp where sessionid = '" + session + "'";
        try {
            consulta.selectPntGenerica(vlquery, JNDI);
            vlrows = consulta.getRows();
            if (vlrows > 0) {
                String[][] vltabla = consulta.getArray();
                param = Integer.parseInt(vltabla[0][0]);
            }
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return param;
    }

    /**
    * Retorna el nombre de parmetros
    * de la tabla temporal que almacena los parmetros
    * Convierte las columnas en filas separadas por (|)
    * <p>
    **/
    public String arregloParamNames(String reporte) {
        String paramNames = "";
        int vlrows = 0;
        String vlqueryOra = "select codrep, listagg (paramname, '|') WITHIN GROUP (ORDER BY paramname) arr FROM bvtparams_temp  where SESSIONID = '"
                + session + "' and codrep = '" + reporte + "' GROUP BY codrep";
        String vlqueryPg = "select codrep, string_agg(paramname,'|' order by paramname)  arr from bvtparams_temp where SESSIONID = '"
                + session + "' and codrep = '" + reporte + "' GROUP BY codrep";
        String vlquerySqlSrv = "";
        try {
            consulta.selectPntGenericaMDB(vlqueryOra, vlqueryPg, vlquerySqlSrv, JNDI);
            vlrows = consulta.getRows();
            if (vlrows > 0) {
                String[][] vltabla = consulta.getArray();
                paramNames = vltabla[0][1];
            }
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return paramNames;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////OPCIONES PARA MOSTRAR LOS D?AS DE LA SEMANA////////////////////////////////
    ///////////////////////SE HACE UN MANEJO DE ESTA FORMA PARA PODER TRASPONER DE FILAS A COLUMNAS////////////////
    ///////////////////////APACHE STRING UTILS/////////////////////////////////////////////////////////////////////
    ///////////////////////ABRIL 2017 DVCONSULTORES AD//////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
    * Abre opciones de dias dependiendo del valor
    * @throws NamingException 
    * @throws SQLException 
    */
    public void showDays() {
        //System.out.println("frecuencia: " + frecuencia);
        if (frecuencia.equals("5")) {
            RequestContext.getCurrentInstance().execute("PF('dlg4').show()");
        }
    }

    /**
    * Abre opciones de dias dependiendo del valor
    * @throws NamingException 
    * @throws SQLException 
    */
    public void showUrl() {
        //System.out.println("frecuencia: " + frecuencia);
        if (opctareas.equals("2")) {
            RequestContext.getCurrentInstance().execute("PF('dlg3').show()");
        }
    }

    //Dias de la semana
    private List<Programacion> list1 = new ArrayList<Programacion>();
    private String vdiasSemana;
    private String vdiasSemanaDesc;

    /**
     * @return the list1
     */
    public List<Programacion> getList1() {
        return list1;
    }

    /**
     * @param list1 the list1 to set
     */
    public void setList1(List<Programacion> list1) {
        this.list1 = list1;
    }

    /**
     * @return the vdiasSemana
     */
    public String getVdiasSemana() {
        return vdiasSemana;
    }

    /**
     * @param vdiasSemana the vdiasSemana to set
     */
    public void setVdiasSemana(String vdiasSemana) {
        this.vdiasSemana = vdiasSemana;
    }

    /**
    * @return the vdiasSemanaDesc
    */
    public String getVdiasSemanaDesc() {
        return vdiasSemanaDesc;
    }

    /**
     * @param vdiasSemanaDesc the vdiasSemanaDesc to set
     */
    public void setVdiasSemanaDesc(String vdiasSemanaDesc) {
        this.vdiasSemanaDesc = vdiasSemanaDesc;
    }

    /**
    * Leer Datos dias de la semana
     * @throws SQLException 
    * @throws NamingException 
    * @throws IOException 
    **/
    public void selectDiasSemana() {
        try {

            Context initContext = new InitialContext();
            DataSource ds = (DataSource) initContext.lookup(JNDI);
            con = ds.getConnection();

            //Reconoce la base de datos de coneccin para ejecutar el query correspondiente a cada uno
            DatabaseMetaData databaseMetaData = con.getMetaData();
            String productName = databaseMetaData.getDatabaseProductName();//Identifica la base de datos de coneccin   

            String query = "";

            switch (productName) {
            case "Oracle":
                query += "  SELECT ";
                query += " case rownum when 1 then 'MON'";
                query += " when 2 then 'TUE'";
                query += " when 3 then 'WED'";
                query += " when 4 then 'THU'";
                query += " when 5 then 'FRI'";
                query += " when 6 then 'SAT'";
                query += " when 7 then 'SUN' end days";
                query += " , case rownum when 1 then 'Lunes'";
                query += " when 2 then 'Martes'";
                query += " when 3 then 'Mircoles'";
                query += " when 4 then 'Jueves'";
                query += " when 5 then 'Viernes'";
                query += " when 6 then 'Sbado'";
                query += " when 7 then 'Domingo' end dias";
                query += " FROM dual CONNECT BY LEVEL <= 7";
                break;
            case "PostgreSQL":
                query = "WITH RECURSIVE t(n) AS (";
                query += " SELECT 1";
                query += " UNION ALL";
                query += " SELECT n+1 FROM t";
                query += " )";
                query += " SELECT case n when 1 then 'MON' when 2 then 'TUE' when 3 then 'WED' when 4 then 'THU' when 5 then 'FRI' when 6 then 'SAT' else 'SUN' end , case n when 1 then 'Lunes' when 2 then 'Martes' when 3 then 'Miercoles' when 4 then 'Jueves' when 5 then 'Viernes' when 6 then 'Sbado' else 'Domingo' end ";
                query += " FROM t  LIMIT 7";
                break;
            }

            pstmt = con.prepareStatement(query);
            //System.out.println(query);

            r = pstmt.executeQuery();

            while (r.next()) {
                Programacion select = new Programacion();
                select.setVdiasSemana(r.getString(1));
                select.setVdiasSemanaDesc(r.getString(2));
                //Agrega la lista
                list1.add(select);
            }

            //Cierra las conecciones
            pstmt.close();
            con.close();
            r.close();

        } catch (SQLException | SchedulerException | NamingException e) {
            e.printStackTrace();
        }

    }
}