LogLevelsService.java

package sk.iway.iwcm.system.audit.rest;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.system.ConfDB;
import sk.iway.iwcm.system.audit.jpa.LogLevelBean;
import sk.iway.iwcm.system.audit.jpa.LogFileBean;

/**
 * Service to handle log levels for packages.
 * They are saved in Constants.logLevel for main level and
 * Constants.logLevels for packages (one package per line).
 * Also can be saved into DB for persistent settings.
 */
public class LogLevelsService {

    public static final String LOG_LEVELS = "logLevels";
    public static final String MAIN_LOG_LEVEL = "logLevel";

    private LogLevelsService() {
        //utility class
    }

    private static final String getLogLevelString(String mainLogLevelPackage, boolean withMainLogLevel) {
        if(withMainLogLevel == true) {
            //Default log level + others
            return mainLogLevelPackage + "=" + Constants.getString(MAIN_LOG_LEVEL) + "\n" + Constants.getString(LOG_LEVELS);
        } else {
            //Only others
            return Constants.getString(LOG_LEVELS);
        }
    }

    public static final List<LogLevelBean> getLogLevelData(String mainLogLevelPackage) {
        String logLevelsString = getLogLevelString(mainLogLevelPackage, true);
        List<LogLevelBean> logLevelData = new ArrayList<>();
        if(Tools.isNotEmpty(logLevelsString)) {
            Long id = 1L;
            String[] logLevelArray = Tools.getTokens(logLevelsString, "\n");
            for(String logLevel : logLevelArray) {
                String[] logLevelValues = logLevel.split("=");
                logLevelData.add(
                    new LogLevelBean(id++, logLevelValues[0], logLevelValues[1])
                );
            }
        }
        return logLevelData;
    }

    private static final LogLevelBean handleMainLogLevel(LogLevelBean mainLogLevel, LogLevelBean defaultMainLogLevel) {
        //This package (main log level) can have only two states DEBUG or NORMAL
        if(mainLogLevel.getLogLevel().equals("DEBUG") || mainLogLevel.getLogLevel().equals("NORMAL")) {
            //DO edit
            Constants.setString(MAIN_LOG_LEVEL, mainLogLevel.getLogLevel().toLowerCase());
            return mainLogLevel;
        } else {
            //Do not update, return old correct value
            return defaultMainLogLevel;
        }
    }

    public static final LogLevelBean editItem(LogLevelBean entity, long id, String mainLogLevelPackage) {
        List<LogLevelBean> logLevelData = getLogLevelData(mainLogLevelPackage);
        String logLevelsString = getLogLevelString(mainLogLevelPackage, false);

        if(entity.getPackageName().equals(mainLogLevelPackage)) {
            return handleMainLogLevel(entity, logLevelData.get(0));
        }

        //it's not main log level -  start with 1 so we skip MAIN_LOG_LEVEL
        for(int i = 1; i < logLevelData.size(); i++) {
            LogLevelBean logLevel = logLevelData.get(i);
            if(logLevel.getId() == id) {
                logLevelsString = logLevelsString.replace(logLevel.getFullLog(), entity.getFullLog());
                Constants.setString(LOG_LEVELS, logLevelsString);
                return entity;
            }
        }
        return null;
    }

    public static final LogLevelBean insertItem(LogLevelBean entity, String mainLogLevelPackage) {
        List<LogLevelBean> logLevelData = getLogLevelData(mainLogLevelPackage);
        String logLevelsString = getLogLevelString(mainLogLevelPackage, false);

        if(entity.getPackageName().equals(mainLogLevelPackage)) {
            return handleMainLogLevel(entity, logLevelData.get(0));
        }

        LogLevelBean exists = null;
        //it's not main log level -  start with 1 so we skip MAIN_LOG_LEVEL
        for(int i = 1; i < logLevelData.size(); i++) {
            LogLevelBean logLevel = logLevelData.get(i);
            if(logLevel.getPackageName().equals(entity.getPackageName())) {
                exists = logLevel;
                break;
            }
        }
        if(exists == null) {
            //CREATE action
            if(Tools.isEmpty(logLevelsString) == true) {
                Constants.setString(LOG_LEVELS, entity.getFullLog());
            } else {
                Constants.setString(LOG_LEVELS, logLevelsString + "\n" + entity.getFullLog());
            }
            entity.setId( Long.valueOf(logLevelData.size() + 1L) );
        } else {
            //Package name is already in use - it's EDIT
            logLevelsString = logLevelsString.replace(exists.getFullLog(), entity.getFullLog());
            Constants.setString(LOG_LEVELS, logLevelsString);
            entity.setId( exists.getId() );
        }
        return entity;
    }

    public static final boolean deleteItem(LogLevelBean entity, long id, String mainLogLevelPackage) {
        boolean isFirst = true;
        StringBuilder logLevelsString = new StringBuilder("");

        if(entity.getPackageName().equals(mainLogLevelPackage)) {
            //Do not delete main log level
            return false;
        }

        List<LogLevelBean> logLevelData = getLogLevelData(mainLogLevelPackage);
        //it's not main log level -  start with 1 so we skip MAIN_LOG_LEVEL
        for(int i = 1; i < logLevelData.size(); i++) {
            LogLevelBean logLevel = logLevelData.get(i);
            //Do not add the one for deletion - ONLY if this is not a main log level
            if(logLevel.getPackageName().equals(entity.getPackageName()) == true && logLevel.getPackageName().equals(mainLogLevelPackage) == false) break;
            if(isFirst) {
                logLevelsString.append(logLevel.getFullLog());
                isFirst = false;
            } else {
                logLevelsString.append("\n").append(logLevel.getFullLog());
            }
        }
        Constants.setString(LOG_LEVELS, logLevelsString.toString());
        return true;
    }

    public static final void afterSave(LogLevelBean entity, String mainLogLevelPackage) {
        if(entity.isSaveIntoDB() == true) {
            if(entity.getPackageName().equals(mainLogLevelPackage)) {
                //MAIN log level
                ConfDB.setName(MAIN_LOG_LEVEL, entity.getLogLevel());
            } else {
                ConfDB.setName(LOG_LEVELS, getLogLevelString(mainLogLevelPackage, false));
            }
        } else {
            //apply log levels to current logger
            Logger.setWJLogLevel(Constants.getString(MAIN_LOG_LEVEL));
            Logger.setWJLogLevels(Logger.getLogLevelsMap(Constants.getString(LOG_LEVELS)));
        }
    }

    public static final List<LogFileBean> getLogFiles() {
        File logDir = new File(System.getProperty("catalina.base"),"logs");
        File[] files = logDir.listFiles();
        List<LogFileBean> result = new ArrayList<>();
        if (files != null) {
            long id = 1L;
            for (File file : files) {
                result.add(new LogFileBean(file, id++));
            }
        }
        return result;
    }
}