消息容器工具類

 

該工具類應用場景:數據需完整校驗,根據錯誤數決定是否執行下一步操作或返回消息給客戶端。
package util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author Jimmy
 * @DATE 2020-1-21
 * 消息容器
 * 應用場景:數據需完整校驗,根據錯誤數決定是否執行下一步操作
 */
public class LogContainer {

    private List<LogEntity> logs = new ArrayList<LogEntity>();//儲存消息的實體對象
    private AtomicInteger errorCount = new AtomicInteger(0);//錯誤次數
    private String prefix = "";//前綴

    private LogContainer() {

    }

    public static LogContainer newInstance() {
        return new LogContainer();
    }

    /**
     * 添加消息
     *
     * @param messageType 消息類型
     * @param msg
     */
    private synchronized void addMessage(MessageTypeEnum messageType, String msg) {
        logs.add(new LogEntity(messageType, this.getPrefix() + msg));
    }

    /**
     * 添加消息
     *
     * @param params
     * @param msg    消息內容
     */
    public void addMessage(String msg, Object... params) {
        msg = generatorMsg(msg, params);
        addMessage(MessageTypeEnum.EMPTY, msg);
    }

    /**
     * 添加 INFO 消息
     *
     * @param msg 消息內容
     */
    public void info(String msg) {
        addMessage(MessageTypeEnum.INFO, msg);
    }

    /**
     * 添加 INFO 消息
     *
     * @param msg    消息內容
     * @param params
     */
    public void info(String msg, Object... params) {
        msg = generatorMsg(msg, params);
        info(msg);
    }

    /**
     * 添加 INFO 消息
     *
     * @param flag   根據flag判斷是否添加消息
     * @param msg    消息內容
     * @param params
     */
    public void info(boolean flag, String msg, Object... params) {
        if (flag) {
            info(msg, params);
        }
    }

    /**
     * 添加 WARN 消息
     *
     * @param msg 消息內容
     */
    public void warn(String msg) {
        addMessage(MessageTypeEnum.WARN, msg);
    }

    /**
     * 添加 WARN 消息
     *
     * @param msg    消息內容
     * @param params
     */
    public void warn(String msg, Object... params) {
        msg = generatorMsg(msg, params);
        warn(msg);
    }

    /**
     * 添加 WARN 消息
     *
     * @param flag   根據flag判斷是否添加消息
     * @param msg    消息內容
     * @param params
     */
    public void warn(boolean flag, String msg, Object... params) {
        if (flag) {
            warn(msg, params);
        }
    }

    /**
     * 添加 ERROR 消息
     *
     * @param msg 消息內容
     */
    public void error(String msg) {
        errorCountIncrease();
        addMessage(MessageTypeEnum.ERROR, msg);
    }

    /**
     * 添加 ERROR 消息
     *
     * @param msg    消息內容
     * @param params
     */
    public void error(String msg, Object... params) {
        msg = generatorMsg(msg, params);
        error(msg);
    }

    /**
     * 添加 ERROR 消息
     *
     * @param flag   根據flag判斷是否添加消息
     * @param msg    消息內容
     * @param params
     */
    public void error(boolean flag, String msg, Object... params) {
        if (flag) {
            error(msg, params);
        }
    }

    /**
     * 消息替換{}
     *
     * @param msg
     * @param params
     * @return
     */
    private String generatorMsg(String msg, Object... params) {
        if (params == null || params.length == 0) {
            return msg;
        }
        for (Object o : params) {
            int idx = msg.indexOf("{}");
            if (idx != -1) {
                msg = msg.replaceFirst("[{][}]", String.valueOf(o));
            } else {
                break;
            }
        }
        return msg;
    }

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    /**
     * 消息斷言
     *
     * @param flag
     * @param msg
     * @param objects
     */
    public void assertIsTrue(boolean flag, String msg, Object... objects) {
        error(!flag, msg, objects);
    }

    /**
     * 添加無狀態小心
     *
     * @param msg
     * @param objects
     */
    public void log(String msg, Object... objects) {
        generatorMsg(msg, objects);
        addMessage(MessageTypeEnum.EMPTY, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ":" + msg);
    }

    public void clear() {
        logs.clear();
    }

    public synchronized void errorCountIncrease() {
        errorCount.incrementAndGet();
    }

    public String showTotalHtmlMessage() {
        String s = showTotalMessage();
        s = s.replaceAll("\n", "<br/>");
        return s;
    }

    public String showErrorHTMLMessage() {
        String s = showErrorMessage();
        s = s.replaceAll("\n", "<br/>");
        return s;
    }

    public String showErrorMessage() {
        StringBuilder sb = new StringBuilder();
        for (LogEntity entity : logs) {
            if (MessageTypeEnum.ERROR.equals(entity.messageType)) {
                sb.append(entity.getMessage()).append("\n");
            }
        }
        return sb.toString();
    }

    public String showTotalMessage() {
        StringBuilder sb = new StringBuilder();
        for (LogEntity entity : logs) {
            switch (entity.messageType) {
                case EMPTY:
                    sb.append(entity.getMessage()).append("\n");
                    break;
                case ERROR:
                case INFO:
                case WARN:
                    sb.append(entity.getMessageType().getDesc() + ":" + entity.getMessage()).append("\n");
                    break;
            }
        }
        return sb.toString();
    }

    public Integer getErrorCount() {
        return errorCount.get();
    }

    public String showInfoHTMLMessage() {
        String s = showInfoMessage();
        s = s.replaceAll("\n", "<br/>");
        return s;
    }

    private String showInfoMessage() {
        StringBuilder sb = new StringBuilder();
        for (LogEntity entity : logs) {
            if (entity == null) {
                continue;
            }
            if (MessageTypeEnum.INFO.equals(entity.getMessageType())) {
                sb.append(entity.getMessage()).append("\n");
            }
        }
        return sb.toString();
    }

    private void addAll(LogContainer newContainer) {
        logs.addAll(newContainer.logContainer());
        errorCount.addAndGet(newContainer.getErrorCount());
    }

    private List<LogEntity> logContainer() {
        return Collections.unmodifiableList(logs);
    }

    public LogContainer subLogContainer() {
        LogContainer subLogContainer = LogContainer.newInstance();
        subLogContainer.setPrefix(this.prefix);
        return subLogContainer;
    }

    private static class LogEntity {
        private MessageTypeEnum messageType;
        private String message;
        private Date date;

        public LogEntity() {

        }

        public LogEntity(MessageTypeEnum messageType, String message) {
            this.message = message;
            this.messageType = messageType;
            this.date = new Date();
        }

        public LogEntity(MessageTypeEnum messageType, String message, Date date) {
            this.message = message;
            this.messageType = messageType;
            this.date = date;
        }

        public MessageTypeEnum getMessageType() {
            return messageType;
        }

        public String getMessage() {
            return message;
        }

        public Date getDate() {
            return date;
        }
    }

    private enum MessageTypeEnum {
        EMPTY(""),//無類別消息
        INFO("提示"),//提示-業務級別
        WARN("警告"),//警告-業務級別
        ERROR("錯誤"),//錯誤-業務級別
        ;
        private String desc;

        MessageTypeEnum(String desc) {
            this.desc = desc;
        }

        public String getDesc() {
            return desc;
        }
    }

    public static void main(String[] args) {
        LogContainer logContainer = LogContainer.newInstance();
        logContainer.info("你好啊!,{},{}", "jimmy");
        for (int i = 0; i < 2; i++) {
            //消息斷言
            logContainer.info("正在處理第{}行", i);
            LogContainer rowContainer = LogContainer.newInstance();
            rowContainer.setPrefix("第" + i + "行:");
            for (int j = 0; j < 2; j++) {
                rowContainer.error("第{}列,數據讀取錯誤", j);
            }
            if (rowContainer.getErrorCount() > 0) {
                //todo dosomething()

            }
            logContainer.addAll(rowContainer);
        }
        System.out.println(logContainer.showTotalMessage());
        //通過errorCount決定是否放行
        if (logContainer.getErrorCount() > 0) {
            System.out.println("錯誤信息:\n" + logContainer.showErrorMessage());
            //todo 退出後續操作,返回錯誤消息給客戶端
        } else {
            System.out.println("一切正常:\n" + logContainer.showInfoMessage());
            //todo 下一操作
        }
        //也可以分開多個logContainer
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章