* calls as cheap as possible by performing lazy evaluation of the log
* message.<p>
*/
-public class CommonsLogger extends POILogger
+public class CommonsLogger implements POILogger
{
private static final LogFactory _creator = LogFactory.getFactory();
- private Log log;
+ private Log log;
@Override
- public void initialize(final String cat)
- {
+ public void initialize(final String cat) {
this.log = _creator.getInstance(cat);
}
* @param obj1 The object to log.
*/
@Override
- protected void _log(final int level, final Object obj1)
- {
+ public void _log(final int level, final Object obj1) {
// FIXME: What happens if level is in between two levels (an even number)?
// Should this be `if (level >= FATAL) ...`?
- if(level==FATAL)
- {
- if(log.isFatalEnabled())
- {
- log.fatal(obj1);
- }
- }
- else if(level==ERROR)
- {
- if(log.isErrorEnabled())
- {
- log.error(obj1);
- }
- }
- else if(level==WARN)
- {
- if(log.isWarnEnabled())
- {
- log.warn(obj1);
- }
- }
- else if(level==INFO)
- {
- if(log.isInfoEnabled())
- {
- log.info(obj1);
- }
- }
- else if(level==DEBUG)
- {
- if(log.isDebugEnabled())
- {
- log.debug(obj1);
- }
- }
- else
- {
- if(log.isTraceEnabled())
- {
- log.trace(obj1);
- }
+ switch (level) {
+ case FATAL:
+ if (log.isFatalEnabled()) {
+ log.fatal(obj1);
+ }
+ break;
+ case ERROR:
+ if (log.isErrorEnabled()) {
+ log.error(obj1);
+ }
+ break;
+ case WARN:
+ if (log.isWarnEnabled()) {
+ log.warn(obj1);
+ }
+ break;
+ case INFO:
+ if (log.isInfoEnabled()) {
+ log.info(obj1);
+ }
+ break;
+ case DEBUG:
+ if (log.isDebugEnabled()) {
+ log.debug(obj1);
+ }
+ break;
+ default:
+ if (log.isTraceEnabled()) {
+ log.trace(obj1);
+ }
+ break;
}
}
* @param exception An exception to be logged
*/
@Override
- protected void _log(final int level, final Object obj1,
- final Throwable exception)
- {
+ public void _log(final int level, final Object obj1, final Throwable exception) {
// FIXME: What happens if level is in between two levels (an even number)?
// Should this be `if (level >= FATAL) ...`?
- if(level==FATAL)
- {
- if(log.isFatalEnabled())
- {
- if(obj1 != null)
- log.fatal(obj1, exception);
- else
- log.fatal(exception);
- }
- }
- else if(level==ERROR)
- {
- if(log.isErrorEnabled())
- {
- if(obj1 != null)
- log.error(obj1, exception);
- else
- log.error(exception);
- }
- }
- else if(level==WARN)
- {
- if(log.isWarnEnabled())
- {
- if(obj1 != null)
- log.warn(obj1, exception);
- else
- log.warn(exception);
- }
- }
- else if(level==INFO)
- {
- if(log.isInfoEnabled())
- {
- if(obj1 != null)
- log.info(obj1, exception);
- else
- log.info(exception);
- }
+ switch (level) {
+ case FATAL:
+ if (log.isFatalEnabled()) {
+ if (obj1 != null) {
+ log.fatal(obj1, exception);
+ } else {
+ log.fatal(exception);
+ }
+ }
+ break;
+ case ERROR:
+ if (log.isErrorEnabled()) {
+ if (obj1 != null) {
+ log.error(obj1, exception);
+ } else {
+ log.error(exception);
+ }
+ }
+ break;
+ case WARN:
+ if (log.isWarnEnabled()) {
+ if (obj1 != null) {
+ log.warn(obj1, exception);
+ } else {
+ log.warn(exception);
+ }
+ }
+ break;
+ case INFO:
+ if (log.isInfoEnabled()) {
+ if (obj1 != null) {
+ log.info(obj1, exception);
+ } else {
+ log.info(exception);
+ }
+ }
+ break;
+ case DEBUG:
+ if (log.isDebugEnabled()) {
+ if (obj1 != null) {
+ log.debug(obj1, exception);
+ } else {
+ log.debug(exception);
+ }
+ }
+ break;
+ default:
+ if (log.isTraceEnabled()) {
+ if (obj1 != null) {
+ log.trace(obj1, exception);
+ } else {
+ log.trace(exception);
+ }
+ }
+ break;
}
- else if(level==DEBUG)
- {
- if(log.isDebugEnabled())
- {
- if(obj1 != null)
- log.debug(obj1, exception);
- else
- log.debug(exception);
- }
- }
- else
- {
- if(log.isTraceEnabled())
- {
- if(obj1 != null)
- log.trace(obj1, exception);
- else
- log.trace(exception);
- }
- }
-
}
/**
{
// FIXME: What happens if level is in between two levels (an even number)?
// Should this be `if (level >= FATAL) ...`?
- if(level==FATAL)
- {
- if(log.isFatalEnabled())
- {
- return true;
- }
- }
- else if(level==ERROR)
- {
- if(log.isErrorEnabled())
- {
- return true;
- }
- }
- else if(level==WARN)
- {
- if(log.isWarnEnabled())
- {
- return true;
- }
+ switch (level) {
+ case FATAL:
+ return log.isFatalEnabled();
+ case ERROR:
+ return log.isErrorEnabled();
+ case WARN:
+ return log.isWarnEnabled();
+ case INFO:
+ return log.isInfoEnabled();
+ case DEBUG:
+ return log.isDebugEnabled();
+ default:
+ return false;
}
- else if(level==INFO)
- {
- if(log.isInfoEnabled())
- {
- return true;
- }
- }
- else if(level==DEBUG)
- {
- if(log.isDebugEnabled())
- {
- return true;
- }
- }
-
- return false;
-
}
-
-
-} // end package scope class POILogger
+}
* message.<p>
*/
@Internal
-public class NullLogger extends POILogger {
+public class NullLogger implements POILogger {
@Override
public void initialize(final String cat) {
// do nothing
*/
@Override
- protected void _log(final int level, final Object obj1) {
+ public void _log(final int level, final Object obj1) {
// do nothing
}
* @param exception An exception to be logged
*/
@Override
- protected void _log(int level, Object obj1, final Throwable exception) {
+ public void _log(int level, Object obj1, final Throwable exception) {
// do nothing
}
* A logger interface that strives to make it as easy as possible for
* developers to write log calls, while simultaneously making those
* calls as cheap as possible by performing lazy evaluation of the log
- * message.<p>
+ * message.
*/
@Internal
-public abstract class POILogger {
+public interface POILogger {
- public static final int DEBUG = 1;
- public static final int INFO = 3;
- public static final int WARN = 5;
- public static final int ERROR = 7;
- public static final int FATAL = 9;
+ int DEBUG = 1;
+ int INFO = 3;
+ int WARN = 5;
+ int ERROR = 7;
+ int FATAL = 9;
/**
- * Short strings for numeric log level. Use level as array index.
+ * Initialize the Logger - belongs to the SPI, called from the POILogFactory
+ * @param cat the String that defines the log
*/
- protected static final String[] LEVEL_STRINGS_SHORT = {"?", "D", "?", "I", "?", "W", "?", "E", "?", "F", "?"};
- /**
- * Long strings for numeric log level. Use level as array index.
- */
- protected static final String[] LEVEL_STRINGS = {"?0?", "DEBUG", "?2?", "INFO", "?4?", "WARN", "?6?", "ERROR", "?8?", "FATAL", "?10+?"};
-
-
- /**
- * package scope so it cannot be instantiated outside of the util
- * package. You need a POILogger? Go to the POILogFactory for one
- */
- POILogger() {
- // no fields to initialize
- }
-
- abstract public void initialize(String cat);
+ void initialize(String cat);
/**
- * Log a message
+ * Log a message - belongs to the SPI, usually not called from user code
*
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
* @param obj1 The object to log. This is converted to a string.
*/
- abstract protected void _log(int level, Object obj1);
+ @Internal
+ void _log(int level, Object obj1);
/**
- * Log a message
+ * Log a message - belongs to the SPI, usually not called from user code
*
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
* @param obj1 The object to log. This is converted to a string.
* @param exception An exception to be logged
*/
- abstract protected void _log(int level, Object obj1, final Throwable exception);
+ @Internal
+ void _log(int level, Object obj1, final Throwable exception);
/**
*
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
*/
- abstract public boolean check(int level);
+ boolean check(int level);
/**
* Log a message. Lazily appends Object parameters together.
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
* @param objs the objects to place in the message
*/
- public void log(int level, Object... objs) {
+ default void log(int level, Object... objs) {
if (!check(level)) return;
StringBuilder sb = new StringBuilder(32);
Throwable lastEx = null;
}
String msg = sb.toString();
- msg = msg.replaceAll("[\r\n]+", " "); // log forging escape
+ // log forging escape
+ msg = msg.replaceAll("[\r\n]+", " ");
- // somehow this ambiguity works and doesn't lead to a loop,
- // but it's confusing ...
if (lastEx == null) {
_log(level, msg);
} else {
* calls as cheap as possible by performing lazy evaluation of the log
* message.
*/
-public class SystemOutLogger extends POILogger
-{
+public class SystemOutLogger implements POILogger {
+ /**
+ * Short strings for numeric log level. Use level as array index.
+ */
+ private static final String LEVEL_STRINGS_SHORT = "?D?I?W?E?F?";
+
private String _cat;
@Override
- public void initialize(final String cat)
- {
+ public void initialize(final String cat) {
this._cat=cat;
}
* @param obj1 The object to log.
*/
@Override
- protected void _log(final int level, final Object obj1)
- {
+ public void _log(final int level, final Object obj1) {
_log(level, obj1, null);
}
*/
@Override
@SuppressForbidden("uses printStackTrace")
- protected void _log(final int level, final Object obj1,
- final Throwable exception) {
- if (check(level)) {
- System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT[Math.min(LEVEL_STRINGS_SHORT.length-1, level)] + " " + obj1);
- if (exception != null) {
- exception.printStackTrace(System.out);
- }
+ public void _log(final int level, final Object obj1, final Throwable exception) {
+ if (!check(level)) {
+ return;
+ }
+ System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT.charAt(Math.min(LEVEL_STRINGS_SHORT.length()-1, level)) + " " + obj1);
+ if (exception != null) {
+ exception.printStackTrace(System.out);
}
}
* @see #FATAL
*/
@Override
- public boolean check(final int level)
- {
+ public boolean check(final int level) {
int currentLevel;
try {
currentLevel = Integer.parseInt(System.getProperty("poi.log.level", WARN + ""));
return level >= currentLevel;
}
-
-
-} // end package scope class POILogger
+}
* tests can see what got logged
*/
@Internal
-public class DummyPOILogger extends POILogger {
+public class DummyPOILogger implements POILogger {
public List<String>logged = new ArrayList<>();
public void reset() {
public void initialize(String cat) {}
@Override
- protected void _log(int level, Object obj1) {
+ public void _log(int level, Object obj1) {
logged.add(level + " - " + obj1);
}
@Override
- protected void _log(int level, Object obj1, Throwable exception) {
+ public void _log(int level, Object obj1, Throwable exception) {
logged.add(level + " - " + obj1 + " - " + exception);
}
}
/**
* Tests the log class.
*/
-public final class TestPOILogger extends POILogger {
+public final class TestPOILogger implements POILogger {
private String lastLog = "";
private Throwable lastEx;
}
@Override
- protected void _log(int level, Object obj1) {
+ public void _log(int level, Object obj1) {
lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = null;
}
@Override
- protected void _log(int level, Object obj1, Throwable exception) {
+ public void _log(int level, Object obj1, Throwable exception) {
lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = exception;
}