該工具類應用場景:數據需完整校驗,根據錯誤數決定是否執行下一步操作或返回消息給客戶端。
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
}
}