Package org.jzonic.jlo.reader

Source Code of org.jzonic.jlo.reader.XMLFileReader

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

Related Classes of org.jzonic.jlo.reader.XMLFileReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.