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    }