001// Generated by delombok at Fri Mar 03 17:40:07 UTC 2023
002package de.cuioss.test.juli;
003
004import static de.cuioss.tools.string.MoreStrings.isEmpty;
005import static java.util.Objects.requireNonNull;
006import java.util.EnumSet;
007import java.util.logging.Level;
008import java.util.logging.Logger;
009
010/**
011 * Defines the log-levels with implicit mapping to JUL log level according to:
012 * <a href=
013 * "https://www.slf4j.org/apidocs/org/slf4j/bridge/SLF4JBridgeHandler.html">SLF4JBridgeHandler</a>
014 *
015 * @author Oliver Wolff
016 */
017public enum TestLogLevel {
018    /**
019     * Trace Level, maps to {@link Level#FINER}.
020     */
021    TRACE(Level.FINER), /**
022     * Debug Level, maps to {@link Level#FINE}.
023     */
024    DEBUG(Level.FINE), /**
025     * Info Level, maps to {@link Level#INFO}.
026     */
027    INFO(Level.INFO), /**
028     * Warn Level, maps to {@link Level#WARNING}.
029     */
030    WARN(Level.WARNING), /**
031     * Error Level, maps to {@link Level#SEVERE}.
032     */
033    ERROR(Level.SEVERE);
034    private final Level juliLevel;
035
036    /**
037     * @param logger to be checked, must not be null
038     * @return {@code true} if the log-level is enabled on the logger, false otherwise
039     */
040    boolean isEnabled(Logger logger) {
041        return logger.isLoggable(getJuliLevel());
042    }
043
044    /**
045     * Convenient method for setting the root-logger-level in the context of the current
046     * {@link TestLogLevel}
047     *
048     * @return the {@link TestLogLevel} itself in order to us is in a fluent way
049     */
050    public TestLogLevel setAsRootLevel() {
051        return addLogger("");
052    }
053
054    /**
055     * Convenient method for setting a Log-Level in the context of the current {@link TestLogLevel}
056     *
057     * @param className if it is {@code null} it will set the root-logger for the actual
058     *            Log-Level
059     * @return the {@link TestLogLevel} itself in order to us is in a fluent way
060     */
061    public TestLogLevel addLogger(Class<?> className) {
062        if (null == className) {
063            return addLogger("");
064        }
065        return addLogger(className.getName());
066    }
067
068    /**
069     * Convenient method for setting a Log-Level in context of the current {@link TestLogLevel}
070     *
071     * @param loggerName if it is {@code null} or empty it will set the root-logger for the actual
072     *            Log-Level
073     * @return the {@link TestLogLevel} itself in order to us is in a fluent way
074     */
075    public TestLogLevel addLogger(String loggerName) {
076        TestLoggerFactory.addLogger(this, loggerName);
077        return this;
078    }
079
080    /**
081     * @param level to be parsed, must not be null
082     * @return the mapped level or {@link TestLogLevel#INFO} if the level can not be mapped
083     */
084    public static TestLogLevel parse(Level level) {
085        requireNonNull(level);
086        for (TestLogLevel testLogLevel : TestLogLevel.values()) {
087            if (testLogLevel.juliLevel.equals(level)) {
088                return testLogLevel;
089            }
090        }
091        return TestLogLevel.INFO;
092    }
093
094    /**
095     * Factory method for deriving a {@link TestLogLevel} from a given String.
096     *
097     * @param levelAsAString The String representation of the desired {@link TestLogLevel}
098     * @param defaultLevel must not be null
099     * @return the desired {@link TestLogLevel} if levelAsAString is null
100     *         or empty or is not a defined {@link TestLogLevel} the method will return the given
101     *         defaultLevel
102     */
103    static TestLogLevel getLevelOrDefault(final String levelAsAString, final TestLogLevel defaultLevel) {
104        requireNonNull(defaultLevel);
105        if (isEmpty(levelAsAString)) {
106            return defaultLevel;
107        }
108        try {
109            return TestLogLevel.valueOf(levelAsAString.toUpperCase());
110        } catch (IllegalArgumentException e) {
111            var message = String.format("Unable to determine logger, expected one of %s, but was %s", EnumSet.allOf(TestLogLevel.class), levelAsAString);
112            Logger.getLogger(TestLogLevel.class.getName()).log(Level.FINE, message, e);
113            return defaultLevel;
114        }
115    }
116
117    @java.lang.SuppressWarnings("all")
118    @lombok.Generated
119    private TestLogLevel(final Level juliLevel) {
120        this.juliLevel = juliLevel;
121    }
122
123    @java.lang.SuppressWarnings("all")
124    @lombok.Generated
125    public Level getJuliLevel() {
126        return this.juliLevel;
127    }
128}