summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/DebugWindow.java
blob: be8c992ce2953b393e3a1e3a3084b8d6a82a21f0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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);
	}
}