package org.openslx.dozmod.gui.helper;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Insets;
import java.io.Serializable;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.openslx.dozmod.gui.Gui;
@Plugin(name = "DebugAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
class DebugAppender extends AbstractAppender
{
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss");
private final JTextPane textPane;
protected DebugAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
final boolean ignoreExceptions, final Property[] properties, final JTextPane textPane)
{
super(name, filter, layout, ignoreExceptions, properties);
this.textPane = textPane;
}
protected DebugAppender(final String name, final Filter filter, final JTextPane textPane)
{
this(name, filter, null, true, null, textPane);
}
@Override
public void append(LogEvent event)
{
final Level eventLevel = event.getLevel();
final Color eventColor;
if (eventLevel.isMoreSpecificThan(Level.ERROR)) {
eventColor = Color.RED;
} else if (eventLevel.isMoreSpecificThan(Level.WARN)) {
eventColor = Color.ORANGE;
} else if (eventLevel.isMoreSpecificThan(Level.INFO)) {
eventColor = Color.BLACK;
} else {
eventColor = Color.GRAY;
}
final long eventTimestamp = event.getTimeMillis();
final String eventThreadName = event.getThreadName();
final String eventLoggerName = event.getLoggerName();
final String eventMessage = event.getMessage().getFormattedMessage();
Gui.asyncExec( new Runnable() {
@Override
public void run()
{
printEvent("[" + formatter.print( eventTimestamp ) + "] ", Color.BLACK);
printEvent(eventThreadName + "@" + eventLoggerName.replaceAll("^.*\\.", ""), Color.GRAY);
printEvent(" " + eventMessage + "\n", eventColor);
}
} );
}
private void printEvent(String msg, Color c) {
StyledDocument doc = this.textPane.getStyledDocument();
SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, c);
try {
doc.insertString(doc.getLength(), msg, keyWord);
} catch (BadLocationException e) {
e.printStackTrace(); // Do not use LOGGER here to prevent infinite loop
}
this.textPane.setCaretPosition(doc.getLength());
}
}
public class DebugWindow extends JPanel {
/**
* Version for serialization.
*/
private static final long serialVersionUID = 2602474207529142616L;
private final JTextPane txtLog;
public DebugWindow() {
setLayout(new BorderLayout());
txtLog = new JTextPane();
txtLog.setEditable(false);
txtLog.setBackground(Color.WHITE);
txtLog.setForeground(Color.BLACK);
txtLog.setBorder(new EmptyBorder(new Insets(5, 5, 5, 5)));
JScrollPane sp = new JScrollPane(txtLog, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sp.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
add(sp, BorderLayout.CENTER);
registerLogger();
validate();
}
private void registerLogger() {
final LoggerContext loggingContext = LoggerContext.class.cast(LogManager.getContext(false));
final Configuration loggingConfig = loggingContext.getConfiguration();
// add debug logging appender
final DebugAppender debugAppender = new DebugAppender("logToDebug", null, this.txtLog);
debugAppender.start();
// register debug logging appender
loggingConfig.addAppender(debugAppender);
loggingConfig.getRootLogger().addAppender(debugAppender, Level.ALL, null);
loggingContext.updateLoggers(loggingConfig);
}
}