/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with this
 * work for additional information regarding copyright ownership. The ASF
 * licenses this file to You under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.apache.sling.commons.threads.impl;

import java.util.concurrent.ThreadPoolExecutor;

import javax.management.NotCompliantMBeanException;
import javax.management.StandardMBean;

import org.apache.sling.commons.threads.impl.DefaultThreadPoolManager.Entry;
import org.apache.sling.commons.threads.jmx.ThreadPoolMBean;

class ThreadPoolMBeanImpl extends StandardMBean implements ThreadPoolMBean {
    
    private final Entry entry;

    ThreadPoolMBeanImpl(Entry entry) throws NotCompliantMBeanException {
        super(ThreadPoolMBean.class);
        this.entry = entry;
    }

    public String getBlockPolicy() {
        return this.entry.getConfig().getBlockPolicy().name();
    }

    public int getExecutorActiveCount() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getActiveCount();
        } else {
            return -1;
        }
    }

    public long getExecutorCompletedTaskCount() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getCompletedTaskCount();
        } else {
            return -1;
        }
    }

    public int getExecutorCorePoolSize() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getCorePoolSize();
        } else {
            return -1;
        }
    }

    public int getExecutorLargestPoolSize() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getLargestPoolSize();
        } else {
            return -1;
        }
    }

    public int getExecutorMaximumPoolSize() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getMaximumPoolSize();
        } else {
            return -1;
        }
    }

    public int getExecutorPoolSize() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getPoolSize();
        } else {
            return -1;
        }
    }

    public long getExecutorTaskCount() {
        final ThreadPoolExecutor tpe = this.entry.getExecutor();
        if ( tpe != null ) {
            return tpe.getTaskCount();
        } else {
            return -1;
        }
    }

    @Deprecated
    public long getMaxThreadAge() {
        return this.entry.getConfig().getMaxThreadAge();
    }

    public long getKeepAliveTime() {
        return this.entry.getConfig().getKeepAliveTime();
    }

    public int getMaxPoolSize() {
        return this.entry.getConfig().getMaxPoolSize();
    }

    public int getMinPoolSize() {
        return this.entry.getConfig().getMinPoolSize();
    }

    public String getName() {
        return this.entry.getName();
    }

    public String getPid() {
        return this.entry.getPid();
    }

    public String getPriority() {
        return this.entry.getConfig().getPriority().name();
    }

    public int getQueueSize() {
        return this.entry.getConfig().getQueueSize();
    }

    public int getShutdownWaitTimeMs() {
        return this.entry.getConfig().getShutdownWaitTimeMs();
    }

    public boolean isDaemon() {
        return this.entry.getConfig().isDaemon();
    }

    public boolean isShutdownGraceful() {
        return this.entry.getConfig().isShutdownGraceful();
    }

    public boolean isUsed() {
        return this.entry.isUsed();
    }

}
