    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.jmx;
    018
    019    import java.util.List;
    020
    021    import javax.management.ObjectName;
    022
    023    import org.apache.logging.log4j.Level;
    024    import org.apache.logging.log4j.core.LoggerContext;
    025    import org.apache.logging.log4j.core.config.AppenderRef;
    026    import org.apache.logging.log4j.core.config.LoggerConfig;
    027    import org.apache.logging.log4j.core.util.Assert;
    028
    029    /**
    030     * Implementation of the {@code LoggerConfigAdminMBean} interface.
    031     */
    032    public class LoggerConfigAdmin implements LoggerConfigAdminMBean {
    033
    034        private final LoggerContext loggerContext;
    035        private final LoggerConfig loggerConfig;
    036        private final ObjectName objectName;
    037
    038        /**
    039         * Constructs a new {@code LoggerConfigAdmin} with the specified LoggerContext
    040         * and logger config.
    041         *
    042         * @param loggerContext used in the {@code ObjectName} for this mbean
    043         * @param loggerConfig the instrumented object
    044         */
    045        public LoggerConfigAdmin(final LoggerContext loggerContext, final LoggerConfig loggerConfig) {
    046            // super(executor); // no notifications for now
    047            this.loggerContext = Assert.requireNonNull(loggerContext, "loggerContext");
    048            this.loggerConfig = Assert.requireNonNull(loggerConfig, "loggerConfig");
    049            try {
    050                final String ctxName = Server.escape(loggerContext.getName());
    051                final String configName = Server.escape(loggerConfig.getName());
    052                final String name = String.format(PATTERN, ctxName, configName);
    053                objectName = new ObjectName(name);
    054            } catch (final Exception e) {
    055                throw new IllegalStateException(e);
    056            }
    057        }
    058
    059        /**
    060         * Returns the {@code ObjectName} of this mbean.
    061         *
    062         * @return the {@code ObjectName}
    063         * @see LoggerConfigAdminMBean#PATTERN
    064         */
    065        public ObjectName getObjectName() {
    066            return objectName;
    067        }
    068
    069        @Override
    070        public String getName() {
    071            return loggerConfig.getName();
    072        }
    073
    074        @Override
    075        public String getLevel() {
    076            return loggerConfig.getLevel().name();
    077        }
    078
    079        @Override
    080        public void setLevel(final String level) {
    081            loggerConfig.setLevel(Level.getLevel(level));
    082            loggerContext.updateLoggers();
    083        }
    084
    085        @Override
    086        public boolean isAdditive() {
    087            return loggerConfig.isAdditive();
    088        }
    089
    090        @Override
    091        public void setAdditive(final boolean additive) {
    092            loggerConfig.setAdditive(additive);
    093            loggerContext.updateLoggers();
    094        }
    095
    096        @Override
    097        public boolean isIncludeLocation() {
    098            return loggerConfig.isIncludeLocation();
    099        }
    100
    101        @Override
    102        public String getFilter() {
    103            return String.valueOf(loggerConfig.getFilter());
    104        }
    105
    106        @Override
    107        public String[] getAppenderRefs() {
    108            final List<AppenderRef> refs = loggerConfig.getAppenderRefs();
    109            final String[] result = new String[refs.size()];
    110            for (int i = 0; i < result.length; i++) {
    111                result[i] = refs.get(i).getRef();
    112            }
    113            return result;
    114        }
    115    }