// Jericho HTML Parser - Java based library for analysing and manipulating HTML
// Version 3.2
// Copyright (C) 2004-2009 Martin Jericho
// http://jericho.htmlparser.net/
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of either one of the following licences:
//
// 1. The Eclipse Public License (EPL) version 1.0,
// included in this distribution in the file licence-epl-1.0.html
// or available at http://www.eclipse.org/legal/epl-v10.html
//
// 2. The GNU Lesser General Public License (LGPL) version 2.1 or later,
// included in this distribution in the file licence-lgpl-2.1.txt
// or available at http://www.gnu.org/licenses/lgpl.txt
//
// This library is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied.
// See the individual licence texts for more details.
package net.htmlparser.jericho;
import java.io.*;
/**
* Provides an implementation of the {@link Logger} interface that sends output to the specified <code>java.io.Writer</code>.
* <p>
* Each log entry is formatted using the {@link BasicLogFormatter#format(String level, String message, String loggerName)} method.
* <p>
* Note that each <a href="Logger.html#LoggingLevel">logging level</a> can be enabled independently in this implementation.
* All levels are enabled by default.
*/
public class WriterLogger implements Logger {
private final Writer writer;
private final String name;
private boolean errorEnabled=true;
private boolean warnEnabled=true;
private boolean infoEnabled=true;
private boolean debugEnabled=true;
/**
* Constructs a new <code>WriterLogger</code> with the specified <code>Writer</code> and the default name.
* <p>
* The default logger name is "<code>net.htmlparser.jericho</code>".
*
* @param writer the <code>Writer</code> to which all output is sent.
*/
public WriterLogger(final Writer writer) {
this(writer,Source.PACKAGE_NAME);
}
/**
* Constructs a new <code>WriterLogger</code> with the specified <code>Writer</code> and name.
* <p>
* The value of the <code>name</code> argument is only relevant if the {@link BasicLogFormatter#OutputName} static property is set to <code>true</code>,
* otherwise the name is not included in the output at all.
*
* @param writer the <code>Writer</code> to which all output is sent.
* @param name the logger name, may be <code>null</code>.
*/
public WriterLogger(final Writer writer, final String name) {
this.writer=writer;
this.name=name;
}
/**
* Returns the <code>Writer</code> to which all output is sent.
* @return the <code>Writer</code> to which all output is sent.
*/
public Writer getWriter() {
return writer;
}
/**
* Returns the name of this logger.
* @return the name of this logger, may be <code>null</code>.
*/
public String getName() {
return name;
}
// Documentation inherited from Logger
public void error(final String message) {
if (isErrorEnabled()) log("ERROR",message);
}
// Documentation inherited from Logger
public void warn(final String message) {
if (isWarnEnabled()) log("WARN",message);
}
// Documentation inherited from Logger
public void info(final String message) {
if (isInfoEnabled()) log("INFO",message);
}
// Documentation inherited from Logger
public void debug(final String message) {
if (isDebugEnabled()) log("DEBUG",message);
}
// Documentation inherited from Logger
public boolean isErrorEnabled() {
return errorEnabled;
}
/**
* Sets whether logging is enabled at the ERROR level.
* @param errorEnabled determines whether logging is enabled at the ERROR level.
*/
public void setErrorEnabled(final boolean errorEnabled) {
this.errorEnabled=errorEnabled;
}
// Documentation inherited from Logger
public boolean isWarnEnabled() {
return warnEnabled;
}
/**
* Sets whether logging is enabled at the WARN level.
* @param warnEnabled determines whether logging is enabled at the WARN level.
*/
public void setWarnEnabled(final boolean warnEnabled) {
this.warnEnabled=warnEnabled;
}
// Documentation inherited from Logger
public boolean isInfoEnabled() {
return infoEnabled;
}
/**
* Sets whether logging is enabled at the INFO level.
* @param infoEnabled determines whether logging is enabled at the INFO level.
*/
public void setInfoEnabled(final boolean infoEnabled) {
this.infoEnabled=infoEnabled;
}
// Documentation inherited from Logger
public boolean isDebugEnabled() {
return debugEnabled;
}
/**
* Sets whether logging is enabled at the DEBUG level.
* @param debugEnabled determines whether logging is enabled at the DEBUG level.
*/
public void setDebugEnabled(final boolean debugEnabled) {
this.debugEnabled=debugEnabled;
}
/**
* Logs the specified message at the specified level.
* <p>
* This method is called internally by the {@link #error(String)}, {@link #warn(String)}, {@link #info(String)} and {@link #debug(String)} methods,
* with the <code>level</code> argument set to the text "<code>ERROR</code>", "<code>WARN</code>", "<code>INFO</code>", or "<code>DEBUG</code>" respectively.
* <p>
* The default implementation of this method sends the the output of
* {@link BasicLogFormatter#format(String,String,String) BasicLogFormatter.format}<code>(level,message,</code>{@link #getName()}<code>)</code>
* to the {@link #getWriter() Writer} specified in the class constructor, and then flushes it.
* <p>
* Overriding this method in a subclass provides a convenient means of logging to a <code>Writer</code> using a different format.
*
* @param level a string representing the level of the log message.
* @param message the message to log.
*/
protected void log(final String level, final String message) {
try {
writer.write(BasicLogFormatter.format(level,message,name));
writer.flush();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}