/*
* 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;
}
}
}