All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.josebran.LogsJB.Execute Maven / Gradle / Ivy

Go to download

LogsJBSupport es una librería java que permite la gestión de registros de un programa en paralelo a la ejecución del programa, lo cual la hace una potente herramienta para programas empresariales y personales que exigen grandes niveles de rendimiento. Para mayor información, consultar el siguiente enlace https://github.com/JoseCarlosBran/LogsJB/blob/master/Readme.md

There is a newer version: 1.0.3
Show newest version
/***
 * Copyright (C) 2022 El proyecto de código abierto LogsJB de José Bran
 *
 * Con licencia de Apache License, Versión 2.0 (la "Licencia");
 * no puede usar este archivo excepto de conformidad con la Licencia.
 * Puede obtener una copia de la Licencia en
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * A menos que lo exija la ley aplicable o se acuerde por escrito, el software
 * distribuido bajo la Licencia se distribuye "TAL CUAL",
 * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas.
 * Consulte la Licencia para conocer el idioma específico que rige los permisos y
 * limitaciones bajo la Licencia.
 */
package com.josebran.LogsJB;

import com.josebran.LogsJB.Numeracion.LogsJBProperties;
import com.josebran.LogsJB.Numeracion.NivelLog;
import com.josebran.LogsJB.Numeracion.SizeLog;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.exception.ExceptionUtils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;

import static com.josebran.LogsJB.MethodsTxt.convertir_fecha;

/****
 * Copyright (C) 2022 El proyecto de código abierto LogsJB de José Bran
 * Clase encargada de recuperar los mensajes de la lista compartida por el Proceso Principal
 * e iniciar un SubProceso encargado de leer los mensajes de la lista y escribirlos en el LogTxt.
 */
public class Execute implements Cloneable {
    /***
     * Se utiliza el patron Singleton, para asegurarnos que sea una unica instancia la que se encargue de
     * Llevar el control de los Logs
     */
    private static final InheritableThreadLocal instance = new InheritableThreadLocal<>() {
        @Override
        protected Execute initialValue() {
            return new Execute();
        }

        @Override
        protected Execute childValue(Execute parentValue) {
            // Retornamos una copia del valor del padre para evitar que se afecte la instancia original
            return parentValue.clone();
        }
    };
    /**
     * Separador que utiliza el sistema de archivos por default
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    private static final String separador = System.getProperty("file.separator");
    private final AtomicBoolean TaskisReady = new AtomicBoolean(true);
    @Getter(AccessLevel.PROTECTED)
    private final MethodsTxt runTXT = new MethodsTxt();
    /**
     * Bandera que indica si la aplicación esta corriendo en un sistema operativo Android
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected Boolean isAndroid = false;
    /**
     * Indica si se imprimira en consola
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected Boolean viewConsole = true;
    /***
     * Obtiene el usuario actual del sistema operativo
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected String usuario = System.getProperty("user.name");
    /****
     * NivelLog desde el grado configurado hacía arriba se estara escribiendo el Log
     * El NivelLog por default es INFO.
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected NivelLog gradeLog = NivelLog.INFO;
    /****
     * Tamaño maximo del archivo LogTxt diario que se estara escribiendo, si se supera el tamaño se modificara
     * el nombre del archivo a LOG_dd-MM-YYYY_HH-MM-SSS.txt, e iniciara la escritura del archivo Log.txt
     * con el nuevo registro.
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected SizeLog sizeLog = SizeLog.Little_Little;
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected Integer validarSize = 5000;
    /***
     * Ruta donde se estara escribiendo el log por default, la cual sería:
     *  ContexAplicación/Logs/fecha_hoy/Log.txt
     */
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    protected String ruta = (Paths.get("").toAbsolutePath().normalize() + separador + "Logs" + separador + convertir_fecha("dd-MM-YYYY") + separador + "Log.txt");
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBviewConsole = LogsJBProperties.LogsJBviewConsole.getProperty();
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBNivelLog = LogsJBProperties.LogsJBNivelLog.getProperty();
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBRutaLog = LogsJBProperties.LogsJBRutaLog.getProperty();
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBSizeLog = LogsJBProperties.LogsJBSizeLog.getProperty();
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBIsAndroid = LogsJBProperties.LogsJBIsAndroid.getProperty();
    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PUBLIC)
    protected String LogsJBValidarSize = LogsJBProperties.LogsJBValidarSize.getProperty();
    /***
     * Lista que funciona como la cola de peticiones que llegan al Ejecutor
     */
    private ListaMensajes listado = new ListaMensajes();

    private Execute() {
        getLogsJBProperties();
    }

    /***
     * Proporciona la instancia de la clase encargada de ejecutar las acciónes en segundo Plano.
     * @return Retorna la instancia de la Clase Execute, que estara trabajando las peticiones de la aplicación
     * en segundo plano.
     */
    protected static Execute getInstance() {
        return instance.get();
        //return instance;
    }

    /**
     * Método para clonar la instancia, asegurando que cada hilo tiene una copia separada
     *
     * @return Instancia correspondiente al hilo actual
     */
    @Override
    protected Execute clone() {
        try {
            Execute cloned = (Execute) super.clone();
            // Clonamos la lista de mensajes también
            //cloned.listado = new ListaMensajes();;
            cloned.listado = new ListaMensajes();
            return cloned;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Error al clonar la instancia de Execute", e);
        }
    }

    /***
     * Setea el NivelLog configurado en las propiedades del sistema, de no estar
     * configurada la propiedad correspondiente a NivelLog, setea el nivel por default.
     */
    protected void setearNivelLog() {
        String nivelLog = System.getProperty(this.LogsJBNivelLog);
        if (Objects.isNull(nivelLog) || nivelLog.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea el nivel por default
            this.setGradeLog(NivelLog.INFO);
        } else {
            if (nivelLog.equals("TRACE")) {
                this.setGradeLog(NivelLog.TRACE);
            }
            if (nivelLog.equals("DEBUG")) {
                this.setGradeLog(NivelLog.DEBUG);
            }
            if (nivelLog.equals("INFO")) {
                this.setGradeLog(NivelLog.INFO);
            }
            if (nivelLog.equals("WARNING")) {
                this.setGradeLog(NivelLog.WARNING);
            }
            if (nivelLog.equals("ERROR")) {
                this.setGradeLog(NivelLog.ERROR);
            }
            if (nivelLog.equals("FATAL")) {
                this.setGradeLog(NivelLog.FATAL);
            }
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("NivelLog"));
    }

    /***
     * Setea la RutaLog configurado en las propiedades del sistema, de no estar
     * configurada la propiedad correspondiente a RutaLog, setea la ruta por default.
     */
    protected void setearRuta() {
        String rutaLog = System.getProperty(this.LogsJBRutaLog);
        if (Objects.isNull(rutaLog) || rutaLog.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea la ruta por default
            String ruta = (Paths.get("").toAbsolutePath().normalize() + separador + "Logs" + separador +
                    convertir_fecha("dd-MM-YYYY") + separador + "Log.txt");
            this.setRuta(ruta);
        } else {
            this.setRuta(rutaLog);
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("RutaLog"));
    }

    /***
     * Setea el SizeLog configurado en las propiedades del sistema, de no estar
     * configurada la propiedad correspondiente a SizeLog, setea el SizeLog por default.
     */
    protected void setearSizelLog() {
        String sizeLog = System.getProperty(this.LogsJBSizeLog);
        if (Objects.isNull(sizeLog) || sizeLog.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea el nivel por default
            this.setSizeLog(SizeLog.Little_Little);
        } else {
            if (sizeLog.equals("Little_Little")) {
                this.setSizeLog(SizeLog.Little_Little);
            }
            if (sizeLog.equals("Little")) {
                this.setSizeLog(SizeLog.Little);
            }
            if (sizeLog.equals("Small_Medium")) {
                this.setSizeLog(SizeLog.Small_Medium);
            }
            if (sizeLog.equals("Medium")) {
                this.setSizeLog(SizeLog.Medium);
            }
            if (sizeLog.equals("Small_Large")) {
                this.setSizeLog(SizeLog.Small_Large);
            }
            if (sizeLog.equals("Large")) {
                this.setSizeLog(SizeLog.Large);
            }
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("SizeLog"));
    }

    /***
     * Setea la propiedad de si la libreria esta siendo utilizada en Android o no
     */
    protected void setearIsAndroid() {
        String Android = System.getProperty(this.LogsJBIsAndroid);
        if (Objects.isNull(Android) || Android.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea el nivel por default
            this.setIsAndroid(false);
        } else {
            this.setIsAndroid(Boolean.valueOf(Android));
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("SizeLog"));
    }

    /***
     * Setea la propiedad de si la libreria imprimira en consola la salida de los logs
     */
    protected void setearViewConsole() {
        String viewConsole = System.getProperty(this.LogsJBviewConsole);
        if (Objects.isNull(viewConsole) || viewConsole.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea el nivel por default
            this.setViewConsole(true);
        } else {
            this.setViewConsole(Boolean.valueOf(viewConsole));
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("SizeLog"));
    }

    /**
     * Setea la propiedad de cada cuantos logs validara el tamaño del log
     */
    protected void setearValidarSize() {
        String LogsJBValidarSize = System.getProperty(this.LogsJBValidarSize);
        if (Objects.isNull(LogsJBValidarSize) || LogsJBValidarSize.isEmpty()) {
            //Si la propiedad del sistema no esta definida, setea el nivel por default
            this.setValidarSize(5000);
        } else {
            this.setValidarSize(Integer.valueOf(LogsJBValidarSize));
        }
        //System.out.println("SystemProperty Seteada soporte: "+System.getProperty("SizeLog"));
    }

    /***
     * Proporciona el acceso a la lista que sirve como cola de las peticiones
     * @return Retorna una lista de MensajeWrite, la cual lleva la información que se desea registrar en los Logs
     */
    protected ListaMensajes getListado() {
        return listado;
    }

    /**
     * Recuperara las propiedades de LogsJB seteadas en las propiedades del sistema
     */
    public void getLogsJBProperties() {
        this.setearRuta();
        this.setearNivelLog();
        this.setearSizelLog();
        this.setearIsAndroid();
        this.setearViewConsole();
        this.setearValidarSize();
        this.runTXT.setInstance(this);
    }

    /***
     * Metodo por medio del cual se llama la escritura de los logs
     */
    protected void run() {
        writePrincipal();
    }

    /***
     * Escritor principal, es el que maneja la logica de la aplicación la cual decide si el log se almacena en una BD's,
     * un Txt Ó si se envía a un RestAPI.
     */
    private void writePrincipal() {
        try {
            this.setTaskisReady(false);
            CompletableFuture escritorPrincipal = CompletableFuture.runAsync(() -> {
                try {
                    //Rutas de archivos
                    File fichero = new File(this.getRuta());
                    //Verifica si existe la carpeta Logs, si no existe, la Crea
                    File directorio = new File(fichero.getParent());
                    if (!directorio.exists()) {
                        if (directorio.mkdirs()) {
                            System.out.println("*");
                            System.out.println("Crea el directorio donde almacenara el Log de la prueba: " + fichero.getParent());
                            System.out.println("*");
                        }
                    }
                    this.runTXT.setBw(new BufferedWriter(new FileWriter(fichero, true)));
                    String temporal = "";
                    boolean band = true;
                    Integer i = 0;
                    while (band) {
                        //System.out.println("Valor de I: "+i);
                        if (i > this.validarSize) {
                            //System.out.println("Revisara el tamaño del fichero: ");
                            this.runTXT.verificarSizeFichero();
                            i = 0;
                        }
                        i++;
                        MensajeWrite mensajetemp = null;
                        mensajetemp = this.getListado().getDato();
                        String Mensaje = mensajetemp.getTexto();
                        NivelLog logtemporal = mensajetemp.getNivelLog();
                        String Clase = mensajetemp.getClase();
                        String Metodo = mensajetemp.getMetodo();
                        String fecha = mensajetemp.getFecha();
                        //Verifica que el nivel de Log a escribir sea igual o mayor al nivel predefinido.
                        this.runTXT.writeLog(logtemporal, Mensaje, Clase, Metodo, fecha);
                        if (this.getListado().getSize() == 0) {
                            band = false;
                            this.runTXT.getBw().close();
                            this.setTaskisReady(true);
                            break;
                        }
                    }
                } catch (IOException e) {
                    System.err.println("Exepcion capturada al inicializar el buffer, " + "Trace de la Exepción : " + ExceptionUtils.getStackTrace(e));
                }
            });
            //this.executorPrincipal.submit(EscritorPrincipal);
        } catch (Exception e) {
            System.err.println("Exepcion capturada en el metodo Escritor principal, " + "Trace de la Exepción : " + ExceptionUtils.getStackTrace(e));
        }
    }

    /**
     * Obtiene la bandera que indica si actualmente esta trabajando la clase Execute o si ya no esta trabajando
     *
     * @return True si esta libre, false si actualmente esta trabajando
     */
    protected Boolean getTaskisReady() {
        return TaskisReady.get();
    }

    /**
     * Setea la bandera que indica si actualmente esta trabajando la clase Execute o si ya no esta trabajando
     *
     * @param taskisReady True si esta libre, false si actualmente esta trabajando
     */
    protected void setTaskisReady(Boolean taskisReady) {
        TaskisReady.set(taskisReady);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy