mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
356 lines
9.2 KiB
Java
356 lines
9.2 KiB
Java
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package org.apache.log4j.gui;
|
|
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Image;
|
|
import java.awt.Toolkit;
|
|
import java.io.*;
|
|
import java.net.URL;
|
|
import java.util.Enumeration;
|
|
import java.util.StringTokenizer;
|
|
import java.util.Hashtable;
|
|
|
|
import javax.swing.Icon;
|
|
import javax.swing.ImageIcon;
|
|
import javax.swing.JTextPane;
|
|
import javax.swing.text.AttributeSet;
|
|
import javax.swing.text.BadLocationException;
|
|
import javax.swing.text.MutableAttributeSet;
|
|
import javax.swing.text.SimpleAttributeSet;
|
|
import javax.swing.text.StyleConstants;
|
|
import javax.swing.text.StyledDocument;
|
|
import javax.swing.text.TabSet;
|
|
import javax.swing.text.TabStop;
|
|
|
|
import org.apache.log4j.*;
|
|
|
|
import org.apache.log4j.spi.LoggingEvent;
|
|
import org.apache.log4j.helpers.Loader;
|
|
import org.apache.log4j.helpers.QuietWriter;
|
|
import org.apache.log4j.helpers.TracerPrintWriter;
|
|
import org.apache.log4j.helpers.OptionConverter;
|
|
|
|
|
|
/**
|
|
* <b>Experimental</b> TextPaneAppender. <br>
|
|
*
|
|
*
|
|
* Created: Sat Feb 26 18:50:27 2000 <br>
|
|
*
|
|
* @author Sven Reimers
|
|
*/
|
|
|
|
public class TextPaneAppender extends AppenderSkeleton {
|
|
|
|
JTextPane textpane;
|
|
StyledDocument doc;
|
|
TracerPrintWriter tp;
|
|
StringWriter sw;
|
|
QuietWriter qw;
|
|
Hashtable attributes;
|
|
Hashtable icons;
|
|
|
|
private String label;
|
|
|
|
private boolean fancy;
|
|
|
|
final String LABEL_OPTION = "Label";
|
|
final String COLOR_OPTION_FATAL = "Color.Emerg";
|
|
final String COLOR_OPTION_ERROR = "Color.Error";
|
|
final String COLOR_OPTION_WARN = "Color.Warn";
|
|
final String COLOR_OPTION_INFO = "Color.Info";
|
|
final String COLOR_OPTION_DEBUG = "Color.Debug";
|
|
final String COLOR_OPTION_BACKGROUND = "Color.Background";
|
|
final String FANCY_OPTION = "Fancy";
|
|
final String FONT_NAME_OPTION = "Font.Name";
|
|
final String FONT_SIZE_OPTION = "Font.Size";
|
|
|
|
public static Image loadIcon ( String path ) {
|
|
Image img = null;
|
|
try {
|
|
URL url = ClassLoader.getSystemResource(path);
|
|
img = (Image) (Toolkit.getDefaultToolkit()).getImage(url);
|
|
} catch (Exception e) {
|
|
System.out.println("Exception occured: " + e.getMessage() +
|
|
" - " + e );
|
|
}
|
|
return (img);
|
|
}
|
|
|
|
public TextPaneAppender(Layout layout, String name) {
|
|
this();
|
|
this.layout = layout;
|
|
this.name = name;
|
|
setTextPane(new JTextPane());
|
|
createAttributes();
|
|
createIcons();
|
|
}
|
|
|
|
public TextPaneAppender() {
|
|
super();
|
|
setTextPane(new JTextPane());
|
|
createAttributes();
|
|
createIcons();
|
|
this.label="";
|
|
this.sw = new StringWriter();
|
|
this.qw = new QuietWriter(sw, errorHandler);
|
|
this.tp = new TracerPrintWriter(qw);
|
|
this.fancy =true;
|
|
}
|
|
|
|
public
|
|
void close() {
|
|
|
|
}
|
|
|
|
private void createAttributes() {
|
|
Priority prio[] = Priority.getAllPossiblePriorities();
|
|
|
|
attributes = new Hashtable();
|
|
for (int i=0; i<prio.length;i++) {
|
|
MutableAttributeSet att = new SimpleAttributeSet();
|
|
attributes.put(prio[i], att);
|
|
StyleConstants.setFontSize(att,14);
|
|
}
|
|
StyleConstants.setForeground((MutableAttributeSet)attributes.get(Priority.ERROR),Color.red);
|
|
StyleConstants.setForeground((MutableAttributeSet)attributes.get(Priority.WARN),Color.orange);
|
|
StyleConstants.setForeground((MutableAttributeSet)attributes.get(Priority.INFO),Color.gray);
|
|
StyleConstants.setForeground((MutableAttributeSet)attributes.get(Priority.DEBUG),Color.black);
|
|
}
|
|
|
|
private void createIcons() {
|
|
Priority prio[] = Priority.getAllPossiblePriorities();
|
|
|
|
icons = new Hashtable();
|
|
for (int i=0; i<prio.length;i++) {
|
|
if (prio[i].equals(Priority.FATAL))
|
|
icons.put(prio[i],new ImageIcon(loadIcon("icons/RedFlag.gif")));
|
|
if (prio[i].equals(Priority.ERROR))
|
|
icons.put(prio[i],new ImageIcon(loadIcon("icons/RedFlag.gif")));
|
|
if (prio[i].equals(Priority.WARN))
|
|
icons.put(prio[i],new ImageIcon(loadIcon("icons/BlueFlag.gif")));
|
|
if (prio[i].equals(Priority.INFO))
|
|
icons.put(prio[i],new ImageIcon(loadIcon("icons/GreenFlag.gif")));
|
|
if (prio[i].equals(Priority.DEBUG))
|
|
icons.put(prio[i],new ImageIcon(loadIcon("icons/GreenFlag.gif")));
|
|
}
|
|
}
|
|
|
|
public void append(LoggingEvent event) {
|
|
String text = this.layout.format(event);
|
|
String trace="";
|
|
// Print Stacktrace
|
|
// Quick Hack maybe there is a better/faster way?
|
|
if (event.throwable!=null) {
|
|
event.throwable.printStackTrace(tp);
|
|
for (int i=0; i< sw.getBuffer().length(); i++) {
|
|
if (sw.getBuffer().charAt(i)=='\t')
|
|
sw.getBuffer().replace(i,i+1," ");
|
|
}
|
|
trace = sw.toString();
|
|
sw.getBuffer().delete(0,sw.getBuffer().length());
|
|
}
|
|
try {
|
|
if (fancy) {
|
|
textpane.setEditable(true);
|
|
textpane.insertIcon((ImageIcon)icons.get(event.priority));
|
|
textpane.setEditable(false);
|
|
}
|
|
doc.insertString(doc.getLength(),text+trace,
|
|
(MutableAttributeSet)attributes.get(event.priority));
|
|
}
|
|
catch (BadLocationException badex) {
|
|
System.err.println(badex);
|
|
}
|
|
textpane.setCaretPosition(doc.getLength());
|
|
}
|
|
|
|
public
|
|
JTextPane getTextPane() {
|
|
return textpane;
|
|
}
|
|
|
|
private
|
|
static
|
|
Color parseColor (String v) {
|
|
StringTokenizer st = new StringTokenizer(v,",");
|
|
int val[] = {255,255,255,255};
|
|
int i=0;
|
|
while (st.hasMoreTokens()) {
|
|
val[i]=Integer.parseInt(st.nextToken());
|
|
i++;
|
|
}
|
|
return new Color(val[0],val[1],val[2],val[3]);
|
|
}
|
|
|
|
private
|
|
static
|
|
String colorToString(Color c) {
|
|
// alpha component emitted only if not default (255)
|
|
String res = ""+c.getRed()+","+c.getGreen()+","+c.getBlue();
|
|
return c.getAlpha() >= 255 ? res : res + ","+c.getAlpha();
|
|
}
|
|
|
|
public
|
|
void setLayout(Layout layout) {
|
|
this.layout=layout;
|
|
}
|
|
|
|
public
|
|
void setName(String name) {
|
|
this.name = name;
|
|
}
|
|
|
|
|
|
public
|
|
void setTextPane(JTextPane textpane) {
|
|
this.textpane=textpane;
|
|
textpane.setEditable(false);
|
|
textpane.setBackground(Color.lightGray);
|
|
this.doc=textpane.getStyledDocument();
|
|
}
|
|
|
|
private
|
|
void setColor(Priority p, String v) {
|
|
StyleConstants.setForeground(
|
|
(MutableAttributeSet)attributes.get(p),parseColor(v));
|
|
}
|
|
|
|
private
|
|
String getColor(Priority p) {
|
|
Color c = StyleConstants.getForeground(
|
|
(MutableAttributeSet)attributes.get(p));
|
|
return c == null ? null : colorToString(c);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// option setters and getters
|
|
|
|
public
|
|
void setLabel(String label) {
|
|
this.label = label;
|
|
}
|
|
public
|
|
String getLabel() {
|
|
return label;
|
|
}
|
|
|
|
public
|
|
void setColorEmerg(String color) {
|
|
setColor(Priority.FATAL, color);
|
|
}
|
|
public
|
|
String getColorEmerg() {
|
|
return getColor(Priority.FATAL);
|
|
}
|
|
|
|
public
|
|
void setColorError(String color) {
|
|
setColor(Priority.ERROR, color);
|
|
}
|
|
public
|
|
String getColorError() {
|
|
return getColor(Priority.ERROR);
|
|
}
|
|
|
|
public
|
|
void setColorWarn(String color) {
|
|
setColor(Priority.WARN, color);
|
|
}
|
|
public
|
|
String getColorWarn() {
|
|
return getColor(Priority.WARN);
|
|
}
|
|
|
|
public
|
|
void setColorInfo(String color) {
|
|
setColor(Priority.INFO, color);
|
|
}
|
|
public
|
|
String getColorInfo() {
|
|
return getColor(Priority.INFO);
|
|
}
|
|
|
|
public
|
|
void setColorDebug(String color) {
|
|
setColor(Priority.DEBUG, color);
|
|
}
|
|
public
|
|
String getColorDebug() {
|
|
return getColor(Priority.DEBUG);
|
|
}
|
|
|
|
public
|
|
void setColorBackground(String color) {
|
|
textpane.setBackground(parseColor(color));
|
|
}
|
|
public
|
|
String getColorBackground() {
|
|
return colorToString(textpane.getBackground());
|
|
}
|
|
|
|
public
|
|
void setFancy(boolean fancy) {
|
|
this.fancy = fancy;
|
|
}
|
|
public
|
|
boolean getFancy() {
|
|
return fancy;
|
|
}
|
|
|
|
public
|
|
void setFontSize(int size) {
|
|
Enumeration e = attributes.elements();
|
|
while (e.hasMoreElements()) {
|
|
StyleConstants.setFontSize((MutableAttributeSet)e.nextElement(),size);
|
|
}
|
|
return;
|
|
}
|
|
|
|
public
|
|
int getFontSize() {
|
|
AttributeSet attrSet = (AttributeSet) attributes.get(Priority.INFO);
|
|
return StyleConstants.getFontSize(attrSet);
|
|
}
|
|
|
|
public
|
|
void setFontName(String name) {
|
|
Enumeration e = attributes.elements();
|
|
while (e.hasMoreElements()) {
|
|
StyleConstants.setFontFamily((MutableAttributeSet)e.nextElement(),name);
|
|
}
|
|
return;
|
|
}
|
|
|
|
public
|
|
String getFontName() {
|
|
AttributeSet attrSet = (AttributeSet) attributes.get(Priority.INFO);
|
|
return StyleConstants.getFontFamily(attrSet);
|
|
}
|
|
|
|
public
|
|
boolean requiresLayout() {
|
|
return true;
|
|
}
|
|
} // TextPaneAppender
|
|
|
|
|
|
|