    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements. See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache license, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License. You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the license for the specific language governing permissions and
    015     * limitations under the license.
    016     */
    017    package org.apache.logging.log4j.core.config;
    018
    019    import org.apache.logging.log4j.Level;
    020    import org.apache.logging.log4j.core.config.plugins.Plugin;
    021    import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
    022    import org.apache.logging.log4j.core.config.plugins.PluginFactory;
    023    import org.apache.logging.log4j.core.util.Assert;
    024    import org.apache.logging.log4j.status.StatusLogger;
    025
    026    /**
    027     * Descriptor of a custom Level object that is created via configuration.
    028     */
    029    @Plugin(name = "CustomLevel", category = "Core", printObject = true)
    030    public final class CustomLevelConfig {
    031
    032        private final String levelName;
    033        private final int intLevel;
    034
    035        private CustomLevelConfig(final String levelName, final int intLevel) {
    036            this.levelName = Assert.requireNonNull(levelName, "levelName is null");
    037            this.intLevel = intLevel;
    038        }
    039
    040        /**
    041         * Creates a CustomLevelConfig object. This also defines the Level object with a call to
    042         * {@link Level#forName(String, int)}.
    043         *
    044         * @param levelName name of the custom level.
    045         * @param intLevel the intLevel that determines where this level resides relative to the built-in levels
    046         * @return A CustomLevelConfig object.
    047         */
    048        @PluginFactory
    049        public static CustomLevelConfig createLevel(// @formatter:off
    050                @PluginAttribute("name") final String levelName,
    051                @PluginAttribute("intLevel") final int intLevel) {
    052            // @formatter:on
    053
    054            StatusLogger.getLogger().debug("Creating CustomLevel(name='{}', intValue={})", levelName, intLevel);
    055            Level.forName(levelName, intLevel);
    056            return new CustomLevelConfig(levelName, intLevel);
    057        }
    058
    059        /**
    060         * Returns the custom level name.
    061         *
    062         * @return the custom level name
    063         */
    064        public String getLevelName() {
    065            return levelName;
    066        }
    067
    068        /**
    069         * Returns the custom level intLevel that determines the strength of the custom level relative to the built-in
    070         * levels.
    071         *
    072         * @return the custom level intLevel
    073         */
    074        public int getIntLevel() {
    075            return intLevel;
    076        }
    077
    078        @Override
    079        public int hashCode() {
    080            return intLevel ^ levelName.hashCode();
    081        }
    082
    083        @Override
    084        public boolean equals(final Object object) {
    085            if (this == object) {
    086                return true;
    087            }
    088            if (!(object instanceof CustomLevelConfig)) {
    089                return false;
    090            }
    091            final CustomLevelConfig other = (CustomLevelConfig) object;
    092            return this.intLevel == other.intLevel && this.levelName.equals(other.levelName);
    093        }
    094
    095        @Override
    096        public String toString() {
    097            return "CustomLevel[name=" + levelName + ", intLevel=" + intLevel + "]";
    098        }
    099    }