hermes.swing.SwingAppender.java Source code

Java tutorial

Introduction

Here is the source code for hermes.swing.SwingAppender.java

Source

/* 
 * Copyright 2003,2004,2005 Colin Crist
 *
 * Licensed 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 hermes.swing;

import java.awt.Font;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JComponent;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

import org.apache.commons.lang.time.FastDateFormat;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

/**
 * Log4j Appender to Swing. Not nice but it works.
 * 
 * @author colincrist@hermesjms.com
 * @version $Id: SwingAppender.java,v 1.4 2007/02/23 12:33:33 colincrist Exp $
 */

public class SwingAppender extends AppenderSkeleton {
    private static Timer timer = new Timer();
    private FastDateFormat format = FastDateFormat.getInstance("yyyy.MM.dd HH:mm:ss");
    private List<String> cachedRows = new ArrayList<String>();
    private long updateInterval = 500;
    private TimerTask timerTask;
    private boolean active = false;
    private String filter;
    private JTextArea textArea = new JTextArea();

    public SwingAppender(String filter) {
        this.filter = filter;

        textArea.setFont(new Font("Courier", Font.PLAIN, 12));
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.log4j.AppenderSkeleton#append(org.apache.log4j.spi.LoggingEvent)
     */
    protected void append(LoggingEvent event) {
        if (!active || !checkEntryConditions()) {
            return;
        }

        if (event.getLoggerName().startsWith(filter)) {
            synchronized (cachedRows) {
                cachedRows.add(format.format(new Date(event.timeStamp)) + " " + event.getLevel() + " ["
                        + event.getThreadName() + "] " + event.getLoggerName() + " " + event.getMessage());
            }

            if (timerTask == null) {
                timerTask = new TimerTask() {
                    public void run() {
                        updateModel();
                    }
                };

                timer.schedule(timerTask, updateInterval, updateInterval);
            }
        }
    }

    public void updateModel() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                synchronized (cachedRows) {
                    while (cachedRows.size() > 0) {
                        textArea.append(cachedRows.remove(0) + "\n");
                    }
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.log4j.Appender#close()
     */
    public void close() {
        clear();
    }

    public void clear() {
        textArea.replaceRange("", 0, textArea.getCaretPosition());
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.log4j.Appender#requiresLayout()
     */
    public boolean requiresLayout() {
        return false;
    }

    protected boolean checkEntryConditions() {
        if (closed || !active) {
            return false;
        }

        return true;
    }

    /**
     * @return Returns the updateInterval.
     */
    public long getUpdateInterval() {
        return updateInterval;
    }

    /**
     * @param updateInterval
     *           The updateInterval to set.
     */
    public void setUpdateInterval(long updateInterval) {
        this.updateInterval = updateInterval;
    }

    /**
     * @return Returns the table.
     */
    public JComponent getComponent() {
        return textArea;
    }

    /**
     * @return Returns the active.
     */
    public boolean isActive() {
        return active;
    }

    /**
     * @param active
     *           The active to set.
     */
    public void setActive(boolean active) {
        this.active = active;

        if (!isActive()) {
            if (timerTask != null) {
                timerTask.cancel();
                timerTask = null;
            }
        }
    }

}