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 javax.management.ObjectName;
020
021import org.apache.logging.log4j.core.util.Assert;
022
023import com.lmax.disruptor.RingBuffer;
024
025/**
026 * Instruments an LMAX Disruptor ring buffer.
027 */
028public class RingBufferAdmin implements RingBufferAdminMBean {
029
030    private final RingBuffer<?> ringBuffer;
031    private final ObjectName objectName;
032
033    public static RingBufferAdmin forAsyncLogger(final RingBuffer<?> ringBuffer, final String contextName) {
034        final String ctxName = Server.escape(contextName);
035        final String name = String.format(PATTERN_ASYNC_LOGGER, ctxName);
036        return new RingBufferAdmin(ringBuffer, name);
037    }
038
039    public static RingBufferAdmin forAsyncLoggerConfig(final RingBuffer<?> ringBuffer, 
040            final String contextName, final String configName) {
041        final String ctxName = Server.escape(contextName);
042        final String cfgName = Server.escape(configName);
043        final String name = String.format(PATTERN_ASYNC_LOGGER_CONFIG, ctxName, cfgName);
044        return new RingBufferAdmin(ringBuffer, name);
045    }
046    
047    protected RingBufferAdmin(final RingBuffer<?> ringBuffer, final String mbeanName) {
048        this.ringBuffer = Assert.requireNonNull(ringBuffer, "ringbuffer");        
049        try {
050            objectName = new ObjectName(mbeanName);
051        } catch (final Exception e) {
052            throw new IllegalStateException(e);
053        }
054    }
055    
056    @Override
057    public long getBufferSize() {
058        return ringBuffer.getBufferSize();
059    }
060    
061    @Override
062    public long getRemainingCapacity() {
063        return ringBuffer.remainingCapacity();
064    }
065
066    /**
067     * Returns the {@code ObjectName} of this mbean.
068     *
069     * @return the {@code ObjectName}
070     * @see RingBufferAdminMBean#PATTERN_ASYNC_LOGGER
071     * @see RingBufferAdminMBean#PATTERN_ASYNC_LOGGER_CONFIG
072     */
073    public ObjectName getObjectName() {
074        return objectName;
075    }
076
077}