summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/DebugWindow.java
blob: be8c992ce2953b393e3a1e3a3084b8d6a82a21f0 (plain) (tree)
1
2
3
4
5
6




                                      
                            











                                             











                                                               

                                              
                                  
 






























































                                                                                                                         

                                         




                                                                          

















                                                                                               









                                                                                                            
 
                                                            
         
 
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);
	}
}