package com.kodcu.logging;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import com.kodcu.service.ThreadService;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.ToggleButton;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* Created by usta on 02.06.2015.
*/
public class TableViewLogAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
private static TableView<MyLog> logViewer;
private static ObservableList<MyLog> logList;
private static List<MyLog> buffer = Collections.synchronizedList(new LinkedList<MyLog>());
private static Label logShortMessage;
private static ThreadService threadService;
PatternLayoutEncoder encoder;
private static ToggleButton logShowHider;
public static void setLogViewer(TableView<MyLog> logViewer) {
TableViewLogAppender.logViewer = logViewer;
}
public static void setLogList(ObservableList<MyLog> logList) {
TableViewLogAppender.logList = logList;
}
public static void setStatusMessage(Label logShortMessage) {
TableViewLogAppender.logShortMessage = logShortMessage;
}
public static void setShowHideLogs(ToggleButton logShowHider) {
TableViewLogAppender.logShowHider = logShowHider;
}
public static ToggleButton getLogShowHider() {
return logShowHider;
}
@Override
protected void append(ILoggingEvent event) {
if (Objects.isNull(logViewer))
return;
String message = event.getFormattedMessage();
String level = event.getLevel().toString();
if (Objects.isNull(message)) {
return;
}
if (event.getLevel() == Level.ERROR) {
logShowHider.getStyleClass().add("red-label");
}
final String finalMessage = message;
threadService.buff("logMessager").schedule(() -> {
threadService.runActionLater(() -> {
logShortMessage.setText(finalMessage);
});
}, 1, TimeUnit.SECONDS);
IThrowableProxy tp = event.getThrowableProxy();
if (Objects.nonNull(tp) && event.getLevel() == Level.ERROR) {
String tpMessage = ThrowableProxyUtil.asString(tp);
message += "\n" + tpMessage;
}
if (!message.isEmpty()) {
MyLog myLog = new MyLog(level, message);
buffer.add(myLog);
}
threadService.buff("logAppender").schedule(() -> {
final List<MyLog> clone = new LinkedList<>(buffer);
buffer.clear();
threadService.runActionLater(() -> {
logList.addAll(clone);
});
}, 2, TimeUnit.SECONDS);
}
public PatternLayoutEncoder getEncoder() {
return encoder;
}
public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
public static void setThreadService(ThreadService threadService) {
TableViewLogAppender.threadService = threadService;
}
}