/*
* XMLFileReader.java
*
* Created on 25. November 2002, 23:05
*/
package org.jzonic.jlo.reader;
import org.jzonic.jlo.*;
import org.jzonic.jlo.error.ErrorHandler;
import org.jzonic.jlo.filter.LogFilter;
import org.jzonic.jlo.formatter.*;
import org.jzonic.jlo.handler.*;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;
/**
*
* @author Administrator
*/
public class XMLFileReader implements LogConfigurationReader {
private String fileName;
private static final VariableManager variableManager = VariableManager.getInstance();
public XMLFileReader() {
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public LogConfiguration parseConfiguration(String configurationName) throws ReaderException {
ResourceLocator rl = new ResourceLocator();
InputStream is = rl.findResource(fileName);
if ( is == null ) {
throw new ReaderException("the file "+fileName+" cannot be found in the classpath");
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
ErrorHandler.reportError("Exception during parser configuration",pce);
throw new ReaderException("Exception during parser configuration:" + pce.getMessage());
}
Document doc = null;
try {
doc = db.parse(is);
} catch (SAXException se) {
ErrorHandler.reportError("Exception while parsing the file", se);
throw new ReaderException(
"Exception while parsing the file:" + se.getMessage());
} catch (IOException ioe) {
ErrorHandler.reportError("IO-Exception", ioe);
throw new ReaderException("IO-Exception:" + ioe.getMessage());
}
return processXML(doc,configurationName);
}
private LogConfiguration processXML(Document doc,String configurationName) {
LogConfiguration lc = new LogConfiguration(configurationName);
getFilters(doc, lc);
getGenerators(doc, lc);
getLoggers(doc, lc);
getChannels(doc, lc);
//getChannels(doc, lc);
getVariables(doc, lc);
getPipes(doc, lc);
return lc;
}
private void getLoggers(Document doc, LogConfiguration lc) {
String currentLogger;
NodeList nl = doc.getElementsByTagName("logger");
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
NamedNodeMap curAtt = n.getAttributes();
Node curNode = curAtt.getNamedItem("name");
currentLogger = curNode.getNodeValue();
String lvl = "INFO";
Vector lgs = new Vector();
String filter = null;
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
String generator = null;
if (child.getNodeName().equals("targets")) {
lvl = child.getFirstChild().getNodeValue();
}
if (child.getNodeName().equals("generator-name")) {
generator = child.getFirstChild().getNodeValue();
lgs.add(generator);
}
if (child.getNodeName().equals("filter-name")) {
filter = child.getFirstChild().getNodeValue();
}
}
if (lgs.size() > 0 ) {
int targets = Target.parse(lvl);
if ( lvl == null ) {
ErrorHandler.reportError("No targets defined for logger:"+currentLogger+". Using ALL as targets");
}
Logger myLogger = new Logger(currentLogger, targets,lc.getName());
if ( filter != null ) {
myLogger.setFilter(lc.getLogFilter(filter));
}
for ( int k = 0; k < lgs.size();k++) {
String lName = (String)lgs.get(k);
LogGenerator lg = lc.getLogGenerator(lName);
if (lg != null) {
myLogger.addLogGenerator(lg);
}
}
lc.addLogger(myLogger);
} else {
ErrorHandler.reportError("No generator-name found. Using default LogGenerator for "+ currentLogger);
LogGenerator lg = lc.getLogGenerator("Default");
int targets = Target.parse(lvl);
Logger myLogger = new Logger(currentLogger, targets,lc.getName());
myLogger.addLogGenerator(lg);
lc.addLogger(myLogger);
}
}
}
private void getVariables(Document doc, LogConfiguration lc) {
String varName;
String varValue;
NodeList nl = doc.getElementsByTagName("variable");
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
NamedNodeMap curAtt = n.getAttributes();
Node curNode = curAtt.getNamedItem("name");
varName = curNode.getNodeValue();
Node valueNode = curAtt.getNamedItem("value");
varValue = valueNode.getNodeValue();
if (varName != null && varValue != null) {
variableManager.addVariable(varName, varValue, lc.getName());
}
else {
if ( varName != null && varValue == null ) {
ErrorHandler.reportError("Variable definition found for:"+varName+" but no value attribute defined");
}
else if ( varName == null && varValue != null ) {
ErrorHandler.reportError("Variable definition found but no name attribute");
}
else if ( varName == null && varValue == null ) {
ErrorHandler.reportError("Variable tag found but no a name and a value attribute");
}
}
}
}
private void getChannels(Document doc, LogConfiguration lc) {
String currentChannel;
NodeList nl = doc.getElementsByTagName("channel");
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
NamedNodeMap curAtt = n.getAttributes();
Node curNode = curAtt.getNamedItem("name");
currentChannel = curNode.getNodeValue();
String generator = null;
String mode = "off";
boolean running = false;
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
if (child.getNodeName().equals("generator-name")) {
generator = child.getFirstChild().getNodeValue();
}
if (child.getNodeName().equals("mode")) {
mode = child.getFirstChild().getNodeValue();
}
}
mode = mode.toLowerCase();
if (mode.equals("on")) {
running = true;
}
if (generator != null) {
LogGenerator lg = lc.getLogGenerator(generator);
if (lg != null) {
Channel myChannel =
new Channel(currentChannel, lg, running);
lc.addChannel(myChannel);
}
else {
ErrorHandler.reportError("Could not find LogGenerator for:"+currentChannel+". Using the default one");
lg = lc.getLogGenerator("Default");
Channel myChannel = new Channel(currentChannel, lg, running);
lc.addChannel(myChannel);
}
}
else {
ErrorHandler.reportError("LogManager getChannels: Using default LogGenerator for "+ currentChannel);
LogGenerator lg = lc.getLogGenerator("Default");
Channel myChannel = new Channel(currentChannel, lg, running);
lc.addChannel(myChannel);
}
}
}
private void getPipes(Document doc, LogConfiguration lc) {
NodeList nl = doc.getElementsByTagName("pipe");
for (int i = 0; i < nl.getLength(); i++) {
LogPipe pipe = null;
String generator = null;
String filter = null;
Node n = nl.item(i);
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
if (child.getNodeName().equals("generator-name")) {
generator = child.getFirstChild().getNodeValue();
}
if (child.getNodeName().equals("filter-name")) {
filter = child.getFirstChild().getNodeValue();
}
}
if (generator != null) {
LogGenerator lg = lc.getLogGenerator(generator);
if (lg != null) {
pipe = new LogPipe();
pipe.setFilter(lc.getLogFilter(filter));
pipe.setGenerator(lg);
lc.addLogPipe(pipe);
}
}
else {
ErrorHandler.reportError("LogManager getPipes: Using default LogGenerator");
LogGenerator lg = lc.getLogGenerator("Default");
pipe = new LogPipe();
pipe.setFilter(lc.getLogFilter(filter));
pipe.setGenerator(lg);
lc.addLogPipe(pipe);
}
}
}
/*
*<filter name="ExceptionFilter">
<class>TextFilter</class>
<parameter name="expression" value="Exception"/>
<parameter name="case_sensitiv" value="false"/>
</filter>
*/
private void getFilters(Document doc, LogConfiguration lc) {
NodeList nl = doc.getElementsByTagName("filter");
for (int i = 0; i < nl.getLength(); i++) {
String filterName = null;
String className = null;
Map params = new HashMap();
Node n = nl.item(i);
NamedNodeMap curAtt = n.getAttributes();
Node curNode = curAtt.getNamedItem("name");
if ( curNode != null ) {
filterName = curNode.getNodeValue();
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
if (child.getNodeName().equals("class")) {
className = child.getFirstChild().getNodeValue();
}
if (child.getNodeName().equals("parameter")) {
String pnName = null;
String pvName = null;
NamedNodeMap childAtt = child.getAttributes();
Node pnNode = childAtt.getNamedItem("name");
if ( pnNode != null) {
pnName = pnNode.getNodeValue();
}
Node pvNode = childAtt.getNamedItem("value");
if ( pvNode != null) {
pvName = pvNode.getNodeValue();
}
if ( pnName != null && pvName != null ) {
params.put(pnName,pvName);
}
}
}
if ( className != null) {
try {
if ( className.indexOf(".") == -1 ) {
className = "org.jzonic.jlo.filter."+className;
}
Class clazz = Class.forName(className);
LogFilter filter = (LogFilter)clazz.newInstance();
filter.setParameters(params);
lc.addLogFilter(filterName,filter);
}
catch (Exception e) {
ErrorHandler.reportError("LogManager getFilters: Cannot instantiate filter:"+filterName);
}
}
else {
ErrorHandler.reportError("LogManager getFilters: No class given for filter:"+filterName);
}
}
else {
ErrorHandler.reportError("No name defined for filter. Ignoring entry");
}
}
}
private void getGenerators(Document doc, LogConfiguration lc) {
String currentGenerator = "default";
NodeList nl = doc.getElementsByTagName("generator");
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
NamedNodeMap curAtt = n.getAttributes();
Node curNode = curAtt.getNamedItem("name");
if (curNode != null) {
currentGenerator = curNode.getNodeValue();
}
Hashtable params = new Hashtable();
Map fParams = new HashMap();
Formatter formatter = null;
Handler handler = null;
String filter = null;
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
if (child.getNodeName().equals("formatter")) {
formatter = getFormatter(child,lc.getName());
}
if (child.getNodeName().equals("handler")) {
handler = getHandler(child,lc.getName());
}
if (child.getNodeName().equals("filter-name")) {
filter = child.getFirstChild().getNodeValue();
}
}
LogGenerator generator = createLogGenerator(currentGenerator, handler, formatter, params,lc.getName());
if ( filter != null ) {
generator.setFilter(lc.getLogFilter(filter));
}
lc.addLogGenerator(generator);
}
}
private Handler getHandler(Node n,String configName) {
NamedNodeMap myAtt = n.getAttributes();
Node myNode = myAtt.getNamedItem("class");
if ( myNode != null ) {
String handlerName = myNode.getNodeValue();
if (handlerName != null) {
// next we set the formatter
Handler handler = HandlerFactory.getHandler(handlerName,configName);
Map params = getParams(n);
handler.setParameter(params);
return handler;
}
}
else {
ErrorHandler.reportError("No class defined for the handler. Ignoring entry");
}
return null;
}
private Formatter getFormatter(Node n,String configName) {
NamedNodeMap myAtt = n.getAttributes();
Node myNode = myAtt.getNamedItem("class");
if ( myNode != null ) {
String formatterName = myNode.getNodeValue();
Formatter formatter = null;
if (formatterName != null) {
// next we set the formatter
formatter = FormatterFactory.getFormatter(formatterName,configName);
Map params = getParams(n);
formatter.setParameter(params);
return formatter;
}
}
else {
ErrorHandler.reportError("No class defined for the formatter. Ignoring entry");
}
return null;
}
private Map getParams(Node n) {
Map params = new HashMap();
for (Node child = n.getFirstChild();child != null;child = child.getNextSibling()) {
if (child.getNodeName().equals("parameter")) {
String pnName = null;
String pvName = null;
NamedNodeMap childAtt = child.getAttributes();
Node pnNode = childAtt.getNamedItem("name");
if ( pnNode != null) {
pnName = pnNode.getNodeValue();
}
Node pvNode = childAtt.getNamedItem("value");
if ( pvNode != null) {
pvName = pvNode.getNodeValue();
}
if ( pnName != null && pvName != null ) {
params.put(pnName,pvName);
}
}
}
return params;
}
public LogGenerator createLogGenerator(String name,String handlerName,String formatterName,Hashtable params,String configName) {
// we create the handler
Handler handler = HandlerFactory.getHandler(handlerName,configName);
if (handler != null)
handler.setParameter(params);
Formatter formatter = null;
if (formatterName != null) {
// next we set the formatter
formatter = FormatterFactory.getFormatter(formatterName,configName);
}
if (handler != null) {
return new LogGenerator(name, handler, formatter);
}
else {
return new LogGenerator(name, new ConsoleHandler(configName), new DefaultFormatter(configName));
}
}
public LogGenerator createLogGenerator(String name,Handler handler,Formatter formatter,Hashtable params,String configName) {
if (handler != null) {
return new LogGenerator(name, handler, formatter);
}
else {
return new LogGenerator(name, new ConsoleHandler(configName), new DefaultFormatter(configName));
}
}
}