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 */
017package org.apache.logging.log4j.core.jmx;
018
019import java.util.Objects;
020
021import javax.management.ObjectName;
022
023import org.apache.logging.log4j.core.Appender;
024import org.apache.logging.log4j.core.filter.AbstractFilterable;
025
026/**
027 * Implementation of the {@code AppenderAdminMBean} interface.
028 */
029public class AppenderAdmin implements AppenderAdminMBean {
030
031    private final String contextName;
032    private final Appender appender;
033    private final ObjectName objectName;
034
035    /**
036     * Constructs a new {@code AppenderAdmin} with the specified contextName
037     * and appender.
038     *
039     * @param contextName used in the {@code ObjectName} for this mbean
040     * @param appender the instrumented object
041     */
042    public AppenderAdmin(final String contextName, final Appender appender) {
043        // super(executor); // no notifications for now
044        this.contextName = Objects.requireNonNull(contextName, "contextName");
045        this.appender = Objects.requireNonNull(appender, "appender");
046        try {
047            final String ctxName = Server.escape(this.contextName);
048            final String configName = Server.escape(appender.getName());
049            final String name = String.format(PATTERN, ctxName, configName);
050            objectName = new ObjectName(name);
051        } catch (final Exception e) {
052            throw new IllegalStateException(e);
053        }
054    }
055
056    /**
057     * Returns the {@code ObjectName} of this mbean.
058     *
059     * @return the {@code ObjectName}
060     * @see AppenderAdminMBean#PATTERN
061     */
062    public ObjectName getObjectName() {
063        return objectName;
064    }
065
066    @Override
067    public String getName() {
068        return appender.getName();
069    }
070
071    @Override
072    public String getLayout() {
073        return String.valueOf(appender.getLayout());
074    }
075
076    @Override
077    public boolean isIgnoreExceptions() {
078        return appender.ignoreExceptions();
079    }
080
081    @Override
082    public String getErrorHandler() {
083        return String.valueOf(appender.getHandler());
084    }
085
086    @Override
087    public String getFilter() {
088        if (appender instanceof AbstractFilterable) {
089            return String.valueOf(((AbstractFilterable) appender).getFilter());
090        }
091        return null;
092    }
093}