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    }