com.egt.core.db.util.Exporter.java Source code

Java tutorial

Introduction

Here is the source code for com.egt.core.db.util.Exporter.java

Source

/*
 * Copyright (C) 2008, EGT Consultores, C.A.
 *
 * Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los trminos
 * de la licencia "GNU General Public License" publicada por la Fundacin "Free Software Foundation".
 *
 * Este programa se distribuye con la esperanza de que pueda ser til, pero SIN NINGUNA GARANTIA;
 * vea la licencia "GNU General Public License" para obtener mas informacin.
 *
 */
package com.egt.core.db.util;

import com.egt.base.constants.CBM2;
import com.egt.base.enums.EnumCondicionEjeFun;
import com.egt.base.jms.messages.ExporterMessage;
import com.egt.core.aplicacion.ExcepcionAplicacion;
import com.egt.core.aplicacion.TLC;
import com.egt.core.constants.EAC;
import com.egt.commons.enums.EnumFormatoArchivo;
import com.egt.commons.util.ThrowableUtils;
import com.egt.core.util.EA;
import com.egt.core.aplicacion.Bitacora;
import com.egt.core.constants.SEV;
import com.egt.core.control.Auditor;
import com.egt.core.util.STP;
import com.egt.core.util.Utils;
import com.egt.core.opencsv.CSVWriter;
import java.io.File;
import java.io.FileWriter;
import java.sql.ResultSet;
import net.sf.jasperreports.engine.JasperReport;
import org.apache.commons.lang.StringUtils;

public class Exporter {

    private static final String DEFAULT_NUMBER_KW = "DEFAULT";

    private static final String DEFAULT_TARGET_KW = "DEFAULT";

    private static final String DEFAULT_SELECT_KW = "DEFAULT";

    public static EnumFormatoArchivo getExportType(String formato) {
        String str = StringUtils.trimToEmpty(formato);
        EnumFormatoArchivo tipo = EnumFormatoArchivo.CSV;
        if (EnumFormatoArchivo.TXT.getExtension().equalsIgnoreCase(str)) {
            tipo = EnumFormatoArchivo.TXT;
        }
        return tipo;
    }

    public static String getExportFormat(EnumFormatoArchivo tipo) {
        String formato = null;
        switch (tipo) {
        case TXT:
            formato = EnumFormatoArchivo.TXT.getExtension();
            break;
        //          case XML:
        //              formato = EnumFormatoArchivo.XML.getExtension();
        //              break;
        default:
            formato = EnumFormatoArchivo.CSV.getExtension();
            break;
        }
        return formato;
    }

    public static Process executeExport(String informe, long funcion) {
        return executeExport(informe, funcion, null, EnumFormatoArchivo.CSV, DEFAULT_SELECT_KW, null);
    }

    public static Process executeExport(String informe, long funcion, EnumFormatoArchivo tipo) {
        return executeExport(informe, funcion, null, tipo, DEFAULT_SELECT_KW, null);
    }

    public static Process executeExport(String informe, long funcion, String select) {
        return executeExport(informe, funcion, null, EnumFormatoArchivo.CSV, select, null);
    }

    public static Process executeExport(String informe, long funcion, EnumFormatoArchivo tipo, String select) {
        return executeExport(informe, funcion, null, tipo, select, null);
    }

    public static Process executeExport(String informe, long funcion, String select, Object[] args) {
        return executeExport(informe, funcion, null, EnumFormatoArchivo.CSV, select, args);
    }

    public static Process executeExport(String informe, long funcion, String destino, EnumFormatoArchivo tipo) {
        return executeExport(informe, funcion, destino, tipo, DEFAULT_SELECT_KW, null);
    }

    public static Process executeExport(String informe, long funcion, String destino, String select) {
        return executeExport(informe, funcion, destino, EnumFormatoArchivo.CSV, select, null);
    }

    public static Process executeExport(String informe, long funcion, String destino, EnumFormatoArchivo tipo,
            String select) {
        return executeExport(informe, funcion, destino, tipo, select, null);
    }

    public static Process executeExport(String informe, long funcion, String destino, String select,
            Object[] args) {
        return executeExport(informe, funcion, destino, EnumFormatoArchivo.CSV, select, args);
    }

    public static Process executeExport(String informe, long funcion, String destino, EnumFormatoArchivo tipo,
            String select, Object[] args) {
        Bitacora.trace(Exporter.class, "executeExport", informe, String.valueOf(funcion), destino,
                String.valueOf(tipo));
        Bitacora.trace(select);
        Utils.traceObjectArray(args);
        Long rastro = null;
        Process subprocess = null;
        try {
            informe = StringUtils.trimToEmpty(informe);
            if (STP.esIdentificadorArchivoValido(informe)) {
                if (TLC.getControlador().esFuncionAutorizada(funcion)) {
                    rastro = TLC.getControlador().ponerInformePendiente(funcion);
                    String command = EA.getString(EAC.EXPORT_RUNNER_DIR) + EA.getString(EAC.EXPORT_RUNNER_CMD);
                    command += " " + commandParameters(informe, rastro, destino, tipo, select, args);
                    String[] envp = null;
                    File dir = new File(EA.getString(EAC.EXPORT_RUNNER_DIR));
                    Bitacora.trace(command);
                    Bitacora.trace(dir.getPath());
                    subprocess = Runtime.getRuntime().exec(command, envp, dir);
                    TLC.getBitacora().info(CBM2.EXPORT_EXECUTION_REQUEST, informe);
                } else {
                    throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM2.FUNCION_NO_AUTORIZADA, informe));
                }
            } else {
                throw new ExcepcionAplicacion(
                        Bitacora.getTextoMensaje(CBM2.IDENTIFICADOR_ARCHIVO_INVALIDO, informe));
            }
        } catch (Exception ex) {
            EnumCondicionEjeFun condicion = EnumCondicionEjeFun.EJECUCION_CANCELADA;
            String mensaje = ThrowableUtils.getString(ex);
            Auditor.grabarRastroInforme(rastro, condicion, null, mensaje);
            TLC.getBitacora().error(mensaje);
        }
        return subprocess;
    }

    private static String commandParameters(String informe, Long rastro, String destino, EnumFormatoArchivo tipo,
            String select, Object[] args) {
        String str = informe + " " + rastro;
        str += " " + trimToDefaultTarget(destino);
        str += " " + getExportFormat(tipo);
        str += " " + Utils.getQuotedParameterString(Utils.encodeSelect(trimToDefaultSelect(select)));
        str += " " + Utils.getQuotedParameterString(args);
        return str;
    }

    public static ExporterMessage export(String informe, long funcion) {
        return export(informe, funcion, null, EnumFormatoArchivo.CSV, DEFAULT_SELECT_KW, null);
    }

    public static ExporterMessage export(String informe, long funcion, EnumFormatoArchivo tipo) {
        return export(informe, funcion, null, tipo, DEFAULT_SELECT_KW, null);
    }

    public static ExporterMessage export(String informe, long funcion, String select) {
        return export(informe, funcion, null, EnumFormatoArchivo.CSV, select, null);
    }

    public static ExporterMessage export(String informe, long funcion, EnumFormatoArchivo tipo, String select) {
        return export(informe, funcion, null, tipo, select, null);
    }

    public static ExporterMessage export(String informe, long funcion, String select, Object[] args) {
        return export(informe, funcion, null, EnumFormatoArchivo.CSV, select, args);
    }

    public static ExporterMessage export(String informe, long funcion, String destino, EnumFormatoArchivo tipo) {
        return export(informe, funcion, destino, tipo, DEFAULT_SELECT_KW, null);
    }

    public static ExporterMessage export(String informe, long funcion, String destino, String select) {
        return export(informe, funcion, destino, EnumFormatoArchivo.CSV, select, null);
    }

    public static ExporterMessage export(String informe, long funcion, String destino, EnumFormatoArchivo tipo,
            String select) {
        return export(informe, funcion, destino, tipo, select, null);
    }

    public static ExporterMessage export(String informe, long funcion, String destino, String select,
            Object[] args) {
        return export(informe, funcion, destino, EnumFormatoArchivo.CSV, select, args);
    }

    public static ExporterMessage export(String informe, long funcion, String destino, EnumFormatoArchivo tipo,
            String select, Object[] args) {
        Bitacora.trace(Exporter.class, "export", informe, String.valueOf(funcion), destino, String.valueOf(tipo));
        Long rastro = null;
        try {
            informe = StringUtils.trimToEmpty(informe);
            if (STP.esIdentificadorArchivoValido(informe)) {
                if (TLC.getControlador().esFuncionAutorizada(funcion)) {
                    rastro = TLC.getControlador().ponerInformePendiente(funcion);
                    return export(informe, rastro, TLC.getControlador().getUsuario().getIdUsuario(), destino, tipo,
                            select, args, false);
                } else {
                    throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM2.FUNCION_NO_AUTORIZADA, informe));
                }
            } else {
                throw new ExcepcionAplicacion(
                        Bitacora.getTextoMensaje(CBM2.IDENTIFICADOR_ARCHIVO_INVALIDO, informe));
            }
        } catch (Exception ex) {
            EnumCondicionEjeFun condicion = EnumCondicionEjeFun.EJECUCION_CANCELADA;
            String mensaje = ThrowableUtils.getString(ex);
            Auditor.grabarRastroInforme(rastro, condicion, null, mensaje);
            TLC.getBitacora().error(mensaje);
        }
        return null;
    }

    public static ExporterMessage export(ExporterMessage message) {
        return export(message.getInforme(), message.getRastro(), message.getUsuario(), message.getDestino(),
                message.getTipo(), message.getSelect(), message.getArgs(), false);
    }

    static ExporterMessage export(String report, String number, String userid, String target, String format,
            String select, Object[] args, boolean logging) {
        Bitacora.trace(Exporter.class, "export", report, number, target, format);
        String informe = StringUtils.trimToEmpty(report);
        Long rastro = trimToNullNumber(number);
        Long usuario = StringUtils.isNotBlank(userid) && StringUtils.isNumeric(userid) ? Long.valueOf(userid)
                : null;
        String destino = trimToNullTarget(target);
        EnumFormatoArchivo tipo = getExportType(format);
        String decode = Utils.decodeSelect(trimToNullSelect(select));
        return export(informe, rastro, usuario, destino, tipo, decode, args, logging);
    }

    private static ExporterMessage export(String informe, Long rastro, Long usuario, String destino,
            EnumFormatoArchivo tipo, String select, Object[] args, boolean logging) {
        Bitacora.trace(Exporter.class, "export", informe, rastro, destino, tipo);
        Bitacora.trace(trimToDefaultSelect(select));
        Utils.traceObjectArray(args);
        String report = StringUtils.trimToEmpty(informe);
        String target = trimToNullTarget(destino);
        String format = getExportFormat(tipo);
        ResultSet resultSet = null;
        //      String archivo = logging ? getLogFileName(rastro) : null;
        String archivo = null;
        EnumCondicionEjeFun condicion = EnumCondicionEjeFun.EJECUCION_EN_PROGRESO;
        String mensaje = TLC.getBitacora().info(CBM2.EXPORT_EXECUTION_BEGIN, report);
        boolean ok = Auditor.grabarRastroInforme(rastro, condicion, archivo, mensaje);
        if (ok) {
            try {
                JasperReport jasperReport = Reporter.getJasperReport(report);
                select = jasperReport == null ? select
                        : Utils.replaceWhereClause(jasperReport.getQuery().getText(), select);
                if (StringUtils.isBlank(select)) {
                    condicion = EnumCondicionEjeFun.EJECUTADO_CON_ERRORES;
                    mensaje = TLC.getBitacora().error(CBM2.ERROR_COMANDO_SELECT);
                } else {
                    int limite = Reporter.getLimiteFilasFuncionSelect(report);
                    resultSet = TLC.getAgenteSql().executeQuery(select, limite, args);
                    if (resultSet.isBeforeFirst()) {
                        archivo = export(resultSet, report, target, format, usuario);
                        condicion = EnumCondicionEjeFun.EJECUTADO_SIN_ERRORES;
                        mensaje = TLC.getBitacora().warn(CBM2.EXPORT_EXECUTION_END, report);
                    } else {
                        condicion = EnumCondicionEjeFun.EJECUTADO_SIN_ERRORES;
                        mensaje = TLC.getBitacora().error(CBM2.SELECT_ROW_EMPTY_SET, report);
                    }
                }
            } catch (Exception ex) {
                condicion = EnumCondicionEjeFun.EJECUTADO_CON_ERRORES;
                mensaje = ThrowableUtils.getString(ex);
                TLC.getBitacora().fatal(ex);
                TLC.getBitacora().fatal(CBM2.EXPORT_EXECUTION_ABEND, report);
            } finally {
                Auditor.grabarRastroInforme(rastro, condicion, archivo, mensaje);
                DB.close(resultSet);
            }
        } else {
            condicion = EnumCondicionEjeFun.EJECUCION_CANCELADA;
            mensaje = TLC.getBitacora().error(CBM2.PROCESS_EXECUTION_ABEND, report);
        }
        ExporterMessage message = new ExporterMessage(report);
        message.setDestino(target);
        message.setTipo(tipo);
        message.setSelect(select);
        message.setArgs(args);
        message.setRastro(rastro);
        message.setCondicion(condicion);
        message.setArchivo(archivo);
        message.setMensaje(mensaje);
        return message;
    }

    private static String export(ResultSet resultSet, String report, String target, String format, Long usuario)
            throws Exception {
        Bitacora.trace(Exporter.class, "export", report, target, format);
        String targetFileName = null;
        if (target == null) {
            targetFileName = report + "_" + System.currentTimeMillis() + "_" + resultSet.hashCode();
        } else {
            targetFileName = target;
        }
        targetFileName += "." + format;
        targetFileName = targetFileName.toLowerCase();
        String outputFileName = Utils.getSpooledFilesDir(usuario) + targetFileName;
        EnumFormatoArchivo type = getExportType(format);
        switch (type) {
        case TXT:
            FileWriter txtFileWriter = new FileWriter(outputFileName);
            CSVWriter txtCSVWriter = new CSVWriter(txtFileWriter, '\t', CSVWriter.NO_QUOTE_CHARACTER,
                    CSVWriter.DEFAULT_ESCAPE_CHARACTER, ',');
            txtCSVWriter.writeAll(resultSet, true);
            txtCSVWriter.close();
            break;
        //          case XML:
        //              break;
        default:
            FileWriter csvFileWriter = new FileWriter(outputFileName);
            CSVWriter csvCSVWriter = new CSVWriter(csvFileWriter, ';', '"', CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                    ',');
            csvCSVWriter.writeAll(resultSet, true);
            csvCSVWriter.close();
            break;
        }
        return targetFileName;
    }

    //  private static String getLogFileName(Long rastro) {
    //      if (rastro == null || rastro == 0) {
    //          return null;
    //      }
    //      return System.getenv(SEV.EXPORT_RUNNER_LOG);
    //  }

    private static String trimToDefaultNumber(String number) {
        String str = StringUtils.trimToEmpty(number);
        return StringUtils.isEmpty(str) || !StringUtils.isNumeric(str) ? DEFAULT_NUMBER_KW : str;
    }

    private static String trimToDefaultTarget(String target) {
        String str = StringUtils.trimToEmpty(target);
        return StringUtils.isEmpty(str) || !STP.esIdentificadorArchivoValido(str) ? DEFAULT_TARGET_KW : str;
    }

    private static String trimToDefaultSelect(String select) {
        String str = StringUtils.trimToEmpty(select);
        return StringUtils.isEmpty(str) ? DEFAULT_SELECT_KW : str;
    }

    private static Long trimToNullNumber(String number) {
        String str = StringUtils.trimToEmpty(number);
        return StringUtils.isEmpty(str) || str.equalsIgnoreCase(DEFAULT_NUMBER_KW) || !StringUtils.isNumeric(str)
                ? null
                : Long.valueOf(str);
    }

    private static String trimToNullTarget(String target) {
        String str = StringUtils.trimToEmpty(target);
        return StringUtils.isEmpty(str) || str.equalsIgnoreCase(DEFAULT_TARGET_KW)
                || !STP.esIdentificadorArchivoValido(str) ? null : str;
    }

    private static String trimToNullSelect(String select) {
        String str = StringUtils.trimToEmpty(select);
        return StringUtils.isEmpty(str) || str.equalsIgnoreCase(DEFAULT_SELECT_KW) ? null : str;
    }
}