/*
 * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.enterprise.admin.monitor.registry;

import org.glassfish.j2ee.statistics.Stats;
import javax.management.ObjectName;
import java.util.Collection;


/**
 * Provides the ability to associate various j2ee components
 * and sub components in a hierarchical tree. Holds references to
 * underlying Stats objects. On instantiation, the Stats object is
 * converted to a DynamicMBean instance. When monitoring level is
 * changed from OFF to LOW or HIGH, the MBean is registered with an
 * MBeanServer. Calls made to the MBean are delegated to this object
 * which in turn delegates it to underlying Stats object.
 * @author  Shreedhar Ganapathy <mailto:shreedhar.ganapathy@sun.com>
 */
public interface StatsHolder {
    /**
     * Add a child node or leaf to this node.
     * @param statsHolder
     */
    StatsHolder addChild(String name, MonitoredObjectType type);

    /**
     * return an array of StatHolder objects each representing a child
     * of this node.
     * @return Collection
     */
    Collection getAllChildren();

    /**
     * removes all children belonging to this node.
     */
    void removeAllChildren();

    /**
     * Returns name of this hierarchical node
     */
    String getName();

    /**
     * Returns type of this hierarchical node
     */
    MonitoredObjectType getType();

    /**
     * sets this hierarchical node's associated stats object. Used when node was
     * originally created without a Stats implementation or a new monitoring
     * level has been set requiring a new Stats registration
     */
    void setStats(Stats stats);

    Stats getStats();

    void setStatsClass(Class c);

    Class getStatsClass();

    void setStatsClassName(String cName);

    String getStatsClassName();

    /**
     * Sets the ObjectName pertaining to the MBean for this node.
     */
    void setObjectName(ObjectName name);

    /**
     * Gets the ObjectName pertaining to the MBean for this node.
     */
    ObjectName getObjectName();

    /**
     * Sets the hierarchically denoted dotted name for this node.
     */
    void setDottedName(String dottedName);

    /**
     * Gets the hierarchically denoted dotted name for this node.
     */
    String getDottedName();

    /**
     * Registers a monitoring MBean with the MBeanServer
     */
    void registerMBean();

    /**
     * Unregisters a monitoring MBean from the MBean Server
     */
    void unregisterMBean();

    void setType(MonitoredObjectType type);

    StatsHolder getChild(String name);

    void removeChild(String name);
}
