001/*
002 * This is free and unencumbered software released into the public domain.
003 *
004 * Please see https://github.com/binkley/binkley/blob/master/LICENSE.md.
005 */
006
007package hm.binkley.util.logging;
008
009import org.slf4j.Logger;
010import org.slf4j.Marker;
011
012/**
013 * {@code Level} inverts calls to SLF4J providing an object for methods corresponding to each
014 * logging level.
015 *
016 * @author <a href="mailto:binkley@alumni.rice.edu">B. K. Oxley (binkley)</a>
017 */
018public enum Level {
019    /** All log calls are ignored. */
020    NONE {
021        @Override
022        public boolean isEnabled(final Logger logger) {
023            return false;
024        }
025
026        @Override
027        public void log(final Logger logger, final String msg) {
028        }
029
030        @Override
031        public void log(final Logger logger, final String format, final Object arg) {
032        }
033
034        @Override
035        public void log(final Logger logger, final String format, final Object arg1,
036                final Object arg2) {
037        }
038
039        @Override
040        public void log(final Logger logger, final String format, final Object... arguments) {
041        }
042
043        @Override
044        public void log(final Logger logger, final String msg, final Throwable t) {
045        }
046
047        @Override
048        public boolean isEnabled(final Logger logger, final Marker marker) {
049            return false;
050        }
051
052        @Override
053        public void log(final Logger logger, final Marker marker, final String msg) {
054        }
055
056        @Override
057        public void log(final Logger logger, final Marker marker, final String format,
058                final Object arg) {
059        }
060
061        @Override
062        public void log(final Logger logger, final Marker marker, final String format,
063                final Object arg1, final Object arg2) {
064        }
065
066        @Override
067        public void log(final Logger logger, final Marker marker, final String format,
068                final Object... argArray) {
069        }
070
071        @Override
072        public void log(final Logger logger, final Marker marker, final String msg,
073                final Throwable t) {
074        }
075    },
076    /** All log calls are at the TRACE level. */
077    TRACE {
078        @Override
079        public boolean isEnabled(final Logger logger) {
080            return logger.isTraceEnabled();
081        }
082
083        @Override
084        public void log(final Logger logger, final String msg) {
085            logger.trace(msg);
086        }
087
088        @Override
089        public void log(final Logger logger, final String format, final Object arg) {
090            logger.trace(format, arg);
091        }
092
093        @Override
094        public void log(final Logger logger, final String format, final Object arg1,
095                final Object arg2) {
096            logger.trace(format, arg1, arg2);
097        }
098
099        @Override
100        public void log(final Logger logger, final String format, final Object... arguments) {
101            logger.trace(format, arguments);
102        }
103
104        @Override
105        public void log(final Logger logger, final String msg, final Throwable t) {
106            logger.trace(msg, t);
107        }
108
109        @Override
110        public boolean isEnabled(final Logger logger, final Marker marker) {
111            return logger.isTraceEnabled(marker);
112        }
113
114        @Override
115        public void log(final Logger logger, final Marker marker, final String msg) {
116            logger.trace(marker, msg);
117        }
118
119        @Override
120        public void log(final Logger logger, final Marker marker, final String format,
121                final Object arg) {
122            logger.trace(marker, format, arg);
123        }
124
125        @Override
126        public void log(final Logger logger, final Marker marker, final String format,
127                final Object arg1, final Object arg2) {
128            logger.trace(marker, format, arg1, arg2);
129        }
130
131        @Override
132        public void log(final Logger logger, final Marker marker, final String format,
133                final Object... argArray) {
134            logger.trace(marker, format, argArray);
135        }
136
137        @Override
138        public void log(final Logger logger, final Marker marker, final String msg,
139                final Throwable t) {
140            logger.trace(marker, msg, t);
141        }
142    },
143    /** All log calls are at the DEBUG level. */
144    DEBUG {
145        @Override
146        public boolean isEnabled(final Logger logger) {
147            return logger.isDebugEnabled();
148        }
149
150        @Override
151        public void log(final Logger logger, final String msg) {
152            logger.debug(msg);
153        }
154
155        @Override
156        public void log(final Logger logger, final String format, final Object arg) {
157            logger.debug(format, arg);
158        }
159
160        @Override
161        public void log(final Logger logger, final String format, final Object arg1,
162                final Object arg2) {
163            logger.debug(format, arg1, arg2);
164        }
165
166        @Override
167        public void log(final Logger logger, final String format, final Object... arguments) {
168            logger.debug(format, arguments);
169        }
170
171        @Override
172        public void log(final Logger logger, final String msg, final Throwable t) {
173            logger.debug(msg, t);
174        }
175
176        @Override
177        public boolean isEnabled(final Logger logger, final Marker marker) {
178            return logger.isDebugEnabled(marker);
179        }
180
181        @Override
182        public void log(final Logger logger, final Marker marker, final String msg) {
183            logger.debug(marker, msg);
184        }
185
186        @Override
187        public void log(final Logger logger, final Marker marker, final String format,
188                final Object arg) {
189            logger.debug(marker, format, arg);
190        }
191
192        @Override
193        public void log(final Logger logger, final Marker marker, final String format,
194                final Object arg1, final Object arg2) {
195            logger.debug(marker, format, arg1, arg2);
196        }
197
198        @Override
199        public void log(final Logger logger, final Marker marker, final String format,
200                final Object... argArray) {
201            logger.debug(marker, format, argArray);
202        }
203
204        @Override
205        public void log(final Logger logger, final Marker marker, final String msg,
206                final Throwable t) {
207            logger.debug(marker, msg, t);
208        }
209    },
210    /** All log calls are at the INFO level. */
211    INFO {
212        @Override
213        public boolean isEnabled(final Logger logger) {
214            return logger.isInfoEnabled();
215        }
216
217        @Override
218        public void log(final Logger logger, final String msg) {
219            logger.info(msg);
220        }
221
222        @Override
223        public void log(final Logger logger, final String format, final Object arg) {
224            logger.info(format, arg);
225        }
226
227        @Override
228        public void log(final Logger logger, final String format, final Object arg1,
229                final Object arg2) {
230            logger.info(format, arg1, arg2);
231        }
232
233        @Override
234        public void log(final Logger logger, final String format, final Object... arguments) {
235            logger.info(format, arguments);
236        }
237
238        @Override
239        public void log(final Logger logger, final String msg, final Throwable t) {
240            logger.info(msg, t);
241        }
242
243        @Override
244        public boolean isEnabled(final Logger logger, final Marker marker) {
245            return logger.isInfoEnabled(marker);
246        }
247
248        @Override
249        public void log(final Logger logger, final Marker marker, final String msg) {
250            logger.info(marker, msg);
251        }
252
253        @Override
254        public void log(final Logger logger, final Marker marker, final String format,
255                final Object arg) {
256            logger.info(marker, format, arg);
257        }
258
259        @Override
260        public void log(final Logger logger, final Marker marker, final String format,
261                final Object arg1, final Object arg2) {
262            logger.info(marker, format, arg1, arg2);
263        }
264
265        @Override
266        public void log(final Logger logger, final Marker marker, final String format,
267                final Object... argArray) {
268            logger.info(marker, format, argArray);
269        }
270
271        @Override
272        public void log(final Logger logger, final Marker marker, final String msg,
273                final Throwable t) {
274            logger.info(marker, msg, t);
275        }
276    },
277    /** All log calls are at the WARN level. */
278    WARN {
279        @Override
280        public boolean isEnabled(final Logger logger) {
281            return logger.isWarnEnabled();
282        }
283
284        @Override
285        public void log(final Logger logger, final String msg) {
286            logger.warn(msg);
287        }
288
289        @Override
290        public void log(final Logger logger, final String format, final Object arg) {
291            logger.warn(format, arg);
292        }
293
294        @Override
295        public void log(final Logger logger, final String format, final Object arg1,
296                final Object arg2) {
297            logger.warn(format, arg1, arg2);
298        }
299
300        @Override
301        public void log(final Logger logger, final String format, final Object... arguments) {
302            logger.warn(format, arguments);
303        }
304
305        @Override
306        public void log(final Logger logger, final String msg, final Throwable t) {
307            logger.warn(msg, t);
308        }
309
310        @Override
311        public boolean isEnabled(final Logger logger, final Marker marker) {
312            return logger.isWarnEnabled(marker);
313        }
314
315        @Override
316        public void log(final Logger logger, final Marker marker, final String msg) {
317            logger.warn(marker, msg);
318        }
319
320        @Override
321        public void log(final Logger logger, final Marker marker, final String format,
322                final Object arg) {
323            logger.warn(marker, format, arg);
324        }
325
326        @Override
327        public void log(final Logger logger, final Marker marker, final String format,
328                final Object arg1, final Object arg2) {
329            logger.warn(marker, format, arg1, arg2);
330        }
331
332        @Override
333        public void log(final Logger logger, final Marker marker, final String format,
334                final Object... argArray) {
335            logger.warn(marker, format, argArray);
336        }
337
338        @Override
339        public void log(final Logger logger, final Marker marker, final String msg,
340                final Throwable t) {
341            logger.warn(marker, msg, t);
342        }
343    },
344    /** All log calls are at the ERROR level. */
345    ERROR {
346        @Override
347        public boolean isEnabled(final Logger logger) {
348            return logger.isErrorEnabled();
349        }
350
351        @Override
352        public void log(final Logger logger, final String msg) {
353            logger.error(msg);
354        }
355
356        @Override
357        public void log(final Logger logger, final String format, final Object arg) {
358            logger.error(format, arg);
359        }
360
361        @Override
362        public void log(final Logger logger, final String format, final Object arg1,
363                final Object arg2) {
364            logger.error(format, arg1, arg2);
365        }
366
367        @Override
368        public void log(final Logger logger, final String format, final Object... arguments) {
369            logger.error(format, arguments);
370        }
371
372        @Override
373        public void log(final Logger logger, final String msg, final Throwable t) {
374            logger.error(msg, t);
375        }
376
377        @Override
378        public boolean isEnabled(final Logger logger, final Marker marker) {
379            return logger.isErrorEnabled(marker);
380        }
381
382        @Override
383        public void log(final Logger logger, final Marker marker, final String msg) {
384            logger.error(marker, msg);
385        }
386
387        @Override
388        public void log(final Logger logger, final Marker marker, final String format,
389                final Object arg) {
390            logger.error(marker, format, arg);
391        }
392
393        @Override
394        public void log(final Logger logger, final Marker marker, final String format,
395                final Object arg1, final Object arg2) {
396            logger.error(marker, format, arg1, arg2);
397        }
398
399        @Override
400        public void log(final Logger logger, final Marker marker, final String format,
401                final Object... argArray) {
402            logger.error(marker, format, argArray);
403        }
404
405        @Override
406        public void log(final Logger logger, final Marker marker, final String msg,
407                final Throwable t) {
408            logger.error(marker, msg, t);
409        }
410    };
411
412    /**
413     * Is the logger instance enabled for this level?
414     *
415     * @return True if this Logger is enabled for this level, false otherwise.
416     */
417    public abstract boolean isEnabled(final Logger logger);
418
419    /**
420     * Log a message at this level.
421     *
422     * @param msg the message string to be logged
423     */
424    public abstract void log(final Logger logger, String msg);
425
426    /**
427     * Log a message at this level according to the specified format and argument. <p/> <p>This form
428     * avoids superfluous object creation when the logger is disabled for this level. </p>
429     *
430     * @param format the format string
431     * @param arg the argument
432     */
433    public abstract void log(final Logger logger, String format, Object arg);
434
435    /**
436     * Log a message at this level according to the specified format and arguments. <p/> <p>This
437     * form avoids superfluous object creation when the logger is disabled for this level. </p>
438     *
439     * @param format the format string
440     * @param arg1 the first argument
441     * @param arg2 the second argument
442     */
443    public abstract void log(final Logger logger, String format, Object arg1, Object arg2);
444
445    /**
446     * Log a message at this level according to the specified format and arguments. <p/> <p>This
447     * form avoids superfluous string concatenation when the logger is disabled for this level.
448     * However, this variant incurs the hidden (and relatively small) cost of creating an {@code
449     * Object[]} before invoking the method, even if this logger is disabled for this level. The
450     * variants taking {@link #log(Logger, String, Object) one} and {@link #log(Logger, String,
451     * Object, Object) two} arguments exist solely in order to avoid this hidden cost.</p>
452     *
453     * @param format the format string
454     * @param arguments a list of 3 or more arguments
455     */
456    public abstract void log(final Logger logger, String format, Object... arguments);
457
458    /**
459     * Log an exception (throwable) at this level with an accompanying message.
460     *
461     * @param msg the message accompanying the exception
462     * @param t the exception (throwable) to log
463     */
464    public abstract void log(final Logger logger, String msg, Throwable t);
465
466    /**
467     * Similar to {@link #isEnabled(Logger)} method except that the marker data is also taken into
468     * account.
469     *
470     * @param marker The marker data to take into consideration
471     *
472     * @return True if this Logger is enabled for this level, false otherwise.
473     */
474    public abstract boolean isEnabled(final Logger logger, Marker marker);
475
476    /**
477     * Log a message with the specific Marker at this level.
478     *
479     * @param marker the marker data specific to this log statement
480     * @param msg the message string to be logged
481     */
482    public abstract void log(final Logger logger, Marker marker, String msg);
483
484    /**
485     * This method is similar to {@link #log(Logger, String, Object)} method except that the marker
486     * data is also taken into consideration.
487     *
488     * @param marker the marker data specific to this log statement
489     * @param format the format string
490     * @param arg the argument
491     */
492    public abstract void log(final Logger logger, Marker marker, String format, Object arg);
493
494    /**
495     * This method is similar to {@link #log(Logger, String, Object, Object)} method except that the
496     * marker data is also taken into consideration.
497     *
498     * @param marker the marker data specific to this log statement
499     * @param format the format string
500     * @param arg1 the first argument
501     * @param arg2 the second argument
502     */
503    public abstract void log(final Logger logger, Marker marker, String format, Object arg1,
504            Object arg2);
505
506    /**
507     * This method is similar to {@link #log(Logger, String, Object...)} method except that the
508     * marker data is also taken into consideration.
509     *
510     * @param marker the marker data specific to this log statement
511     * @param format the format string
512     * @param argArray an array of arguments
513     */
514    public abstract void log(final Logger logger, Marker marker, String format, Object... argArray);
515
516    /**
517     * This method is similar to {@link #log(Logger, String, Throwable)} method except that the
518     * marker data is also taken into consideration.
519     *
520     * @param marker the marker data specific to this log statement
521     * @param msg the message accompanying the exception
522     * @param t the exception (throwable) to log
523     */
524    public abstract void log(final Logger logger, Marker marker, String msg, Throwable t);
525}