/*
 * 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.qpid.server.virtualhost;

import java.security.AccessControlContext;

public class ConnectionPrincipalStatisticsCheckingTask extends HouseKeepingTask
{
    private static final String TASK_NAME = "ConnectionPrincipalStatisticsCheck";
    private final ConnectionPrincipalStatisticsRegistry _connectionPrincipalStatisticsRegistry;

    public ConnectionPrincipalStatisticsCheckingTask(final QueueManagingVirtualHost virtualHost,
                                                     final AccessControlContext controlContext,
                                                     final ConnectionPrincipalStatisticsRegistry connectionPrincipalStatisticsRegistry)
    {
        super(TASK_NAME, virtualHost, controlContext);
        _connectionPrincipalStatisticsRegistry = connectionPrincipalStatisticsRegistry;
    }

    @Override
    public void execute()
    {
        _connectionPrincipalStatisticsRegistry.reevaluateConnectionStatistics();
    }
}
