/**
* Copyright 2009 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.safehaus.penrose.log.log4j;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultElement;
import org.dom4j.Element;
import java.io.Writer;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileWriter;
/**
* @author Endi S. Dewata
*/
public class Log4jConfigWriter {
public Log4jConfigWriter() {
}
public void write(File file, Log4jConfig config) throws Exception {
Element element = createConfigElement(config);
Writer out;
if (file == null) {
out = new PrintWriter(System.out, true);
} else {
file.getParentFile().mkdirs();
out = new FileWriter(file);
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setTrimText(false);
XMLWriter writer = new XMLWriter(out, format);
writer.startDocument();
writer.startDTD(
"log4j:configuration",
"-//Apache//DTD Log4j 1.2//EN",
"http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd");
writer.write(element);
writer.close();
out.close();
}
public void close() throws Exception {
}
public Element createConfigElement(Log4jConfig config) {
Element element = new DefaultElement("log4j:configuration");
element.addAttribute("xmlns:log4j", "http://jakarta.apache.org/log4j/");
if (config.isDebug()) element.addAttribute("debug", "true");
for (AppenderConfig appenderConfig : config.getAppenderConfigs()) {
Element appenderElement = createAppenderElement(appenderConfig);
element.add(appenderElement);
}
for (LoggerConfig loggerConfig : config.getLoggerConfigs()) {
Element loggerElement = createLoggerElement(loggerConfig);
element.add(loggerElement);
}
if (config.getRootLoggerConfig() != null) {
Element rootElement = createRootElement(config.getRootLoggerConfig());
element.add(rootElement);
}
return element;
}
public Element createAppenderElement(AppenderConfig appenderConfig) {
Element element = new DefaultElement("appender");
element.addAttribute("name", appenderConfig.getName());
element.addAttribute("class", appenderConfig.getAppenderClass());
for (String name : appenderConfig.getParameterNames()) {
String value = appenderConfig.getParameter(name);
Element parameterElement = createParameterElement(name, value);
element.add(parameterElement);
}
if (appenderConfig.getLayoutConfig() != null) {
Element layoutElement = createLayoutElement(appenderConfig.getLayoutConfig());
element.add(layoutElement);
}
return element;
}
public Element createLayoutElement(LayoutConfig layoutConfig) {
Element element = new DefaultElement("layout");
element.addAttribute("class", layoutConfig.getLayoutClass());
for (String name : layoutConfig.getParameterNames()) {
String value = layoutConfig.getParameter(name);
Element parameterElement = createParameterElement(name, value);
element.add(parameterElement);
}
return element;
}
public Element createParameterElement(String name, String value) {
Element element = new DefaultElement("param");
element.addAttribute("name", name);
element.addAttribute("value", value);
return element;
}
public Element createLoggerElement(LoggerConfig loggerConfig) {
Element element = new DefaultElement("logger");
element.addAttribute("name", loggerConfig.getName());
if (!loggerConfig.getAdditivity()) element.addAttribute("additivity", "false");
if (loggerConfig.getLevel() != null) {
Element levelElement = new DefaultElement("level");
levelElement.addAttribute("value", loggerConfig.getLevel());
element.add(levelElement);
}
for (String appenderName : loggerConfig.getAppenderNames()) {
Element appenderRefElement = new DefaultElement("appender-ref");
appenderRefElement.addAttribute("ref", appenderName);
element.add(appenderRefElement);
}
return element;
}
public Element createRootElement(RootLoggerConfig rootConfig) {
Element element = new DefaultElement("root");
if (rootConfig.getLevel() != null) {
Element levelElement = new DefaultElement("level");
levelElement.addAttribute("value", rootConfig.getLevel());
element.add(levelElement);
}
for (String appenderName : rootConfig.getAppenderNames()) {
Element appenderRefElement = new DefaultElement("appender-ref");
appenderRefElement.addAttribute("ref", appenderName);
element.add(appenderRefElement);
}
return element;
}
}