hk.hku.cecid.piazza.commons.util.LoggerLog4j.java Source code

Java tutorial

Introduction

Here is the source code for hk.hku.cecid.piazza.commons.util.LoggerLog4j.java

Source

/* 
 * Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The
 * University of Hong Kong (HKU). All Rights Reserved.
 *
 * This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1]
 * 
 * [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 */

package hk.hku.cecid.piazza.commons.util;

import hk.hku.cecid.piazza.commons.module.ComponentException;
import hk.hku.cecid.piazza.commons.module.PersistentComponent;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * LoggerLog4j is an implementation of a Logger and is backed by a Log4j logger. 
 * 
 * @see org.apache.log4j.Logger
 * 
 * @author Hugo Y. K. Lam
 * 
 */
public class LoggerLog4j extends PersistentComponent implements hk.hku.cecid.piazza.commons.util.Logger {

    private Logger logger;

    /**
     * Creates a new instance of LoggerLog4j. 
     */
    public LoggerLog4j() {
        super();
    }

    /**
     * Creates a new instance of LoggerLog4j.
     * 
     * @param url the url of the configuration file.
     * @throws ComponentException if the configuration could not be loaded from the specified url.
     */
    public LoggerLog4j(URL url) throws ComponentException {
        super(url);
    }

    /**
     * Creates a new instance of LoggerLog4j.
     *  
     * @param name the logger category name. null if the name should be looked up dynamically in logging.
     */
    public LoggerLog4j(String name) {
        this();
        setLogger(name);
    }

    /**
     * Creates a new instance of LoggerLog4j.
     *  
     * @param name the logger category name. null if the name should be looked up dynamically in logging.
     * @param url the url of the configuration file.
     * @throws UtilitiesException if the configuration could not be loaded from the specified url.
     */
    public LoggerLog4j(String name, URL url) throws Exception {
        this(url);
        setLogger(name);
    }

    /**
     * Initializes this logger and sets a default logger if specified.
     * 
     * @throws Exception if error occurred in initialization.
     * @see hk.hku.cecid.piazza.commons.module.Component#init()
     */
    protected void init() throws Exception {
        super.init();
        setLogger(getParameters().getProperty("category"));
    }

    /**
     * Sets the logger category name.
     * 
     * @param name the logger category name.
     */
    private void setLogger(String name) {
        if (name != null && !"".equals(name = name.trim())) {
            logger = Logger.getLogger(name);
        }
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#debug(java.lang.Object)
     */
    public void debug(Object msg) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).debug(msg);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#debug(java.lang.Object, java.lang.Throwable)
     */
    public void debug(Object msg, Throwable throwable) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).debug(msg, throwable);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#error(java.lang.Object)
     */
    public void error(Object msg) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).error(msg);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#error(java.lang.Object, java.lang.Throwable)
     */
    public void error(Object msg, Throwable throwable) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).error(msg, throwable);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#fatal(java.lang.Object)
     */
    public void fatal(Object msg) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).fatal(msg);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#fatal(java.lang.Object, java.lang.Throwable)
     */
    public void fatal(Object msg, Throwable throwable) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).fatal(msg, throwable);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#warn(java.lang.Object)
     */
    public void warn(Object msg) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).warn(msg);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#warn(java.lang.Object, java.lang.Throwable)
     */
    public void warn(Object msg, Throwable throwable) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).warn(msg, throwable);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#info(java.lang.Object)
     */
    public void info(Object msg) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).info(msg);
    }

    /**
     * @see hk.hku.cecid.piazza.commons.util.Logger#info(java.lang.Object, java.lang.Throwable)
     */
    public void info(Object msg, Throwable throwable) {
        (logger == null ? Logger.getLogger(Caller.getName()) : logger).info(msg, throwable);
    }

    /**
     * Checks if the logger itself is in debug mode.
     * 
     * @return true if the logger itself is in debug mode.
     */
    public boolean isDebugEnabled() {
        return (logger == null ? Logger.getLogger(Caller.getName()) : logger).isDebugEnabled();
    }

    /**
     * Loads the configuration from the specified url location.
     * A DOM configuration will be triggered if the url ends with ".xml". 
     * 
     * @param url the url of the configuration source.
     * @throws Exception if the operation is unsuccessful. 
     * @see hk.hku.cecid.piazza.commons.module.PersistentComponent#loading(java.net.URL)
     */
    protected void loading(URL url) throws Exception {
        if (url.getPath().toLowerCase().endsWith(".xml")) {
            Properties params = getParameters();
            if (params != null) {
                String checkConfig = params.getProperty("checkConfig");

                if (checkConfig != null) {
                    if (checkConfig.equals("true")) {

                        SAXReader xmlReader = new SAXReader();
                        xmlReader.setEntityResolver(new EntityResolver() {
                            public InputSource resolveEntity(String publicId, String systemId)
                                    throws SAXException, IOException {
                                return new InputSource(new ByteArrayInputStream(new byte[0]));
                            }
                        });
                        org.dom4j.Document doc = xmlReader.read(url);
                        Node node = doc.selectSingleNode("/*[local-name()='configuration']/category/priority");
                        String priority = node.valueOf("@value");
                        if (!chechPriorityString(priority)) {
                            throw new UtilitiesException(
                                    "Log4j does not support the value for priority - " + priority);
                        }

                        // Node node2 = doc.selectSingleNode("/*[local-name()='configuration']/root/priority");
                        String priority2 = node.valueOf("@value");
                        if (!chechPriorityString(priority2)) {
                            throw new UtilitiesException(
                                    "Log4j does not support the value for priority - " + priority2);
                        }
                    }
                }
            }

            DOMConfigurator.configure(url);
        } else {
            PropertyConfigurator.configure(url);
        }
    }

    private boolean chechPriorityString(String nodeValue) {
        if (nodeValue.equals("all") || nodeValue.equals("debug") || nodeValue.equals("info")
                || nodeValue.equals("warn") || nodeValue.equals("error") || nodeValue.equals("fatal")
                || nodeValue.equals("off") || nodeValue.equals("null")) {
            return true;
        } else {
            return false;
        }
    }
}