    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 javax.management.ObjectName;
    020
    021    import org.apache.logging.log4j.core.appender.AsyncAppender;
    022    import org.apache.logging.log4j.core.util.Assert;
    023
    024    /**
    025     * Implementation of the {@code AsyncAppenderAdminMBean} interface.
    026     */
    027    public class AsyncAppenderAdmin implements AsyncAppenderAdminMBean {
    028
    029        private final String contextName;
    030        private final AsyncAppender asyncAppender;
    031        private final ObjectName objectName;
    032
    033        /**
    034         * Constructs a new {@code AsyncAppenderAdmin} with the specified contextName
    035         * and async appender.
    036         *
    037         * @param contextName used in the {@code ObjectName} for this mbean
    038         * @param appender the instrumented object
    039         */
    040        public AsyncAppenderAdmin(final String contextName, final AsyncAppender appender) {
    041            // super(executor); // no notifications for now
    042            this.contextName = Assert.requireNonNull(contextName, "contextName");
    043            this.asyncAppender = Assert.requireNonNull(appender, "async appender");
    044            try {
    045                final String ctxName = Server.escape(this.contextName);
    046                final String configName = Server.escape(appender.getName());
    047                final String name = String.format(PATTERN, ctxName, configName);
    048                objectName = new ObjectName(name);
    049            } catch (final Exception e) {
    050                throw new IllegalStateException(e);
    051            }
    052        }
    053
    054        /**
    055         * Returns the {@code ObjectName} of this mbean.
    056         *
    057         * @return the {@code ObjectName}
    058         * @see AppenderAdminMBean#PATTERN
    059         */
    060        public ObjectName getObjectName() {
    061            return objectName;
    062        }
    063
    064        @Override
    065        public String getName() {
    066            return asyncAppender.getName();
    067        }
    068
    069        @Override
    070        public String getLayout() {
    071            return String.valueOf(asyncAppender.getLayout());
    072        }
    073
    074        @Override
    075        public boolean isIgnoreExceptions() {
    076            return asyncAppender.ignoreExceptions();
    077        }
    078
    079        @Override
    080        public String getErrorHandler() {
    081            return String.valueOf(asyncAppender.getHandler());
    082        }
    083
    084        @Override
    085        public String getFilter() {
    086            return String.valueOf(asyncAppender.getFilter());
    087        }
    088
    089        @Override
    090        public String[] getAppenderRefs() {
    091            return asyncAppender.getAppenderRefStrings();
    092        }
    093
    094        /**
    095         * Returns {@code true} if this AsyncAppender will take a snapshot of the stack with
    096         * every log event to determine the class and method where the logging call
    097         * was made.
    098         * @return {@code true} if location is included with every event, {@code false} otherwise
    099         */
    100        @Override
    101        public boolean isIncludeLocation() {
    102            return asyncAppender.isIncludeLocation();
    103        }
    104
    105        /**
    106         * Returns {@code true} if this AsyncAppender will block when the queue is full,
    107         * or {@code false} if events are dropped when the queue is full.
    108         * @return whether this AsyncAppender will block or drop events when the queue is full.
    109         */
    110        @Override
    111        public boolean isBlocking() {
    112            return asyncAppender.isBlocking();
    113        }
    114
    115        /**
    116         * Returns the name of the appender that any errors are logged to or {@code null}.
    117         * @return the name of the appender that any errors are logged to or {@code null}
    118         */
    119        @Override
    120        public String getErrorRef() {
    121            return asyncAppender.getErrorRef();
    122        }
    123
    124        @Override
    125        public int getQueueCapacity() {
    126            return asyncAppender.getQueueCapacity();
    127        }
    128
    129        @Override
    130        public int getQueueRemainingCapacity() {
    131            return asyncAppender.getQueueRemainingCapacity();
    132        }
    133    }