/*
 * 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 com.sun.enterprise.config.serverbeans.*;
import java.util.HashMap;

/**
 * MonitoredObjectType represents the type of a monitored object. Many of
 * monitored objects have same properties, even while they monitor different
 * user objects. For example - application and standalone ejb module are both
 * nothing more than containers of other objects -- application contains web
 * module and ejb modules, whereas standalone ejb module contains beans of
 * various types. This object facilitates use of same GenericMonitorMBean as
 * MBean for both of them, but still distinguishes them.
 *
 * @see com.iplanet.ias.admin.monitor.GenericMonitorMBean
 * @author Originally authored by Abhijit Kumar
 * @author Copied from S1AS 7.0 source and modified by Shreedhar Ganapathy
 */
public class MonitoredObjectType {

    /**
     * A map to store all objects of type MonitoredObjectType using their string
     * representation as key.
     */
    private static final HashMap objectMap = new HashMap();
    /**
     * to be able to initialize to a non-valid type
     */
    public static final MonitoredObjectType NONE = new MonitoredObjectType("none", true);
    /**
     * ROOT MonitoredObject - singleton
     */
    public static final MonitoredObjectType ROOT = new MonitoredObjectType("root", true);
    /**
     * Parent of all applications and modules and other children - singleton
     */
    public static final MonitoredObjectType APPLICATIONS = new MonitoredObjectType("applications", true);
    /**
     * MonitoredObjectType for any deployed application - multiple
     */
    public static final MonitoredObjectType APPLICATION = new MonitoredObjectType("application");
    /**
     * An ejb module within an application - multiple
     */
    public static final MonitoredObjectType EJBMODULE = new MonitoredObjectType("ejb-module");
    /**
     * A web module within an application - multiple
     */
    public static final MonitoredObjectType WEBMODULE = new MonitoredObjectType("web-module");
    /**
     * A standalone ejb module - multiple
     */
    public static final MonitoredObjectType STANDALONE_EJBMODULE = new MonitoredObjectType("standalone-ejb-module");
    /**
     * A standalone web module - multiple
     */
    public static final MonitoredObjectType STANDALONE_WEBMODULE = new MonitoredObjectType("standalone-web-module");
    /**
     * A stateless session bean - multiple
     */
    public static final MonitoredObjectType STATELESS_BEAN = new MonitoredObjectType("stateless-session-bean");
    /**
     * A stateful session bean - multiple
     */
    public static final MonitoredObjectType STATEFUL_BEAN = new MonitoredObjectType("stateful-session-bean");
    /**
     * A entity session bean - multiple
     */
    public static final MonitoredObjectType ENTITY_BEAN = new MonitoredObjectType("entity-bean");
    /**
     * A message driven bean - multiple
     */
    public static final MonitoredObjectType MESSAGE_DRIVEN_BEAN = new MonitoredObjectType("message-driven-bean");
    /**
     * An ejb pool - one per ejb
     */
    public static final MonitoredObjectType BEAN_POOL = new MonitoredObjectType("bean-pool", true);
    /**
     * An ejb cache - one per ejb
     */
    public static final MonitoredObjectType BEAN_CACHE = new MonitoredObjectType("bean-cache", true);
    /*
     * An ejb method - multiple
     */
    public static final MonitoredObjectType BEAN_METHOD = new MonitoredObjectType("bean-method");
    /*
     * All ejb methods - one per ejb
     */
    public static final MonitoredObjectType BEAN_METHODS = new MonitoredObjectType("bean-methods", true);
    /**
     * A servlet - multiple
     */
    public static final MonitoredObjectType SERVLET = new MonitoredObjectType("servlet");
    /**
     * Http Service node - singleton
     */
    public static final MonitoredObjectType HTTP_SERVICE = new MonitoredObjectType("http-service", true);
    /**
     * Virtual server - multiple
     */
    public static final MonitoredObjectType VIRTUAL_SERVER = new MonitoredObjectType("virtual-server");
    /**
     * webmodule-virtualserver, fix for 6172666
     */
    public static final MonitoredObjectType WEBAPP_VIRTUAL_SERVER = new MonitoredObjectType("webmodule-virtual-server");
    /**
     * Http Listener - multiple
     */
    public static final MonitoredObjectType HTTP_LISTENER = new MonitoredObjectType("http-listener");
    /**
     * JVM - singleton
     */
    public static final MonitoredObjectType JVM = new MonitoredObjectType("jvm", true);
    /**
     * Transaction service - singleton
     */
    public static final MonitoredObjectType TRANSACTION_SERVICE = new MonitoredObjectType("transaction-service", true);
    /**
     * Thread pools - singleton
     */
    public static final MonitoredObjectType THREAD_POOLS = new MonitoredObjectType("thread-pools", true);
    /**
     * A named thead pool - multiple
     */
    public static final MonitoredObjectType THREAD_POOL = new MonitoredObjectType("thread-pool");
    /**
     * ORB - singleton
     */
    public static final MonitoredObjectType ORB = new MonitoredObjectType("orb", true);
    /**
     * Connection Managers - singleton
     */
    public static final MonitoredObjectType CONNECTION_MANAGERS = new MonitoredObjectType("connection-managers", true);
    /**
     * A Connection Manager for orb - multiple
     */
    public static final MonitoredObjectType CONNECTION_MANAGER = new MonitoredObjectType("connection-manager", true);
    /**
     * All the monitorable resources - singleton
     */
    public static final MonitoredObjectType RESOURCES = new MonitoredObjectType("resources", true);
    /**
     * A monitorable jdbc connection pool - multiple
     */
    public static final MonitoredObjectType JDBC_CONN_POOL = new MonitoredObjectType("jdbc-connection-pool");
    /**
     * A monitorable connector connection pool - multiple
     */
    public static final MonitoredObjectType CONNECTOR_CONN_POOL = new MonitoredObjectType("connector-connection-pool");
    /**
     * Any Web Container Element -- not used in hierarchy -- mainly for
     * notification
     */
    public static final MonitoredObjectType WEB_COMPONENT = new MonitoredObjectType("web-component");
    /**
     * Jndi monitoring
     */
    public static final MonitoredObjectType JNDI = new MonitoredObjectType("jndi", true);
    // for connector monitoring
    public static final MonitoredObjectType CONNECTOR_SERVICE = new MonitoredObjectType("connector-service", true);
    public static final MonitoredObjectType CONNECTOR_MODULE = new MonitoredObjectType("connector-module");
    public static final MonitoredObjectType STANDALONE_CONNECTOR_MODULE = new MonitoredObjectType("standalone-connector-module");
    public static final MonitoredObjectType CONNECTOR_WORKMGMT = new MonitoredObjectType("work-management", true);
    public static final MonitoredObjectType JMS_SERVICE = new MonitoredObjectType("jms-service", true);
    public static final MonitoredObjectType CONNECTION_FACTORIES = new MonitoredObjectType("connection-factories", true);
    public static final MonitoredObjectType CONNECTION_FACTORY = new MonitoredObjectType("connection-factory");
    public static final MonitoredObjectType CONNECTION_POOLS = new MonitoredObjectType("connection-pools", true);
    // for PWC Monitoring
    public static final MonitoredObjectType CONNECTION_QUEUE = new MonitoredObjectType("connection-queue", true);
    public static final MonitoredObjectType DNS = new MonitoredObjectType("dns", true);
    public static final MonitoredObjectType KEEP_ALIVE = new MonitoredObjectType("keep-alive", true);
    public static final MonitoredObjectType PWC_THREAD_POOL = new MonitoredObjectType("pwc-thread-pool", true);
    public static final MonitoredObjectType FILE_CACHE = new MonitoredObjectType("file-cache", true);
    public static final MonitoredObjectType REQUEST = new MonitoredObjectType("request", true);
    // for StatefulSessionStore Monitoring
    public static final MonitoredObjectType SESSION_STORE = new MonitoredObjectType("stateful-session-store", true);
    // for Timer Monitoring
    public static final MonitoredObjectType TIMERS = new MonitoredObjectType("timers", true);
    // for JVM1.5 Monitoring
    public static final MonitoredObjectType JVM_COMPILATION = new MonitoredObjectType("compilation-system", true);
    public static final MonitoredObjectType JVM_CLASSLOADING = new MonitoredObjectType("class-loading-system", true);
    public static final MonitoredObjectType JVM_OS = new MonitoredObjectType("operating-system", true);
    public static final MonitoredObjectType JVM_RUNTIME = new MonitoredObjectType("runtime", true);
    public static final MonitoredObjectType JVM_GCS = new MonitoredObjectType("garbage-collectors", true);
    public static final MonitoredObjectType JVM_GC = new MonitoredObjectType("garbage-collector");
    public static final MonitoredObjectType JVM_MEMORY = new MonitoredObjectType("memory", true);
    public static final MonitoredObjectType JVM_THREAD = new MonitoredObjectType("thread-system", true);
    public static final MonitoredObjectType JVM_THREAD_INFO = new MonitoredObjectType("threadinfo");
    /**
     * A web service endpoint with in an ejb or web module - multiple
     */
    public static final MonitoredObjectType WEBSERVICE_ENDPOINT =
            new MonitoredObjectType("webservice-endpoint");
    /**
     * value of this object as a string
     */
    private String typeName;
    /**
     * Denotes whether this type allows more than one instance at any level.
     */
    private boolean isSingleton;

    /**
     * Creates a new instance of MonitoredObjectType using specified string type
     *
     * @param type string representing the name of monitored object type
     */
    private MonitoredObjectType(String type) {
        this(type, false);
    }

    /**
     * Creates a new instance of MonitoredObjectType using specified string type
     * and specified flag for singleton
     *
     * @param type string representing the name of monitored object type
     * @param isSingleton denotes whether this type of monitored object has only
     * one instance (in its context)
     */
    private MonitoredObjectType(String type, boolean isSingleton) {
        this.typeName = type;
        this.isSingleton = isSingleton;
        objectMap.put(this.typeName, this);
    }

    /**
     * Get type of this "MonitoredObjectType" as string
     *
     * @return Monitored object type as string
     */
    public String getTypeName() {
        return typeName;
    }

    /**
     * Is instance of this type of MonitorMBean singleton. For example, there
     * can only be one pool for every stateless session bean, so a
     * MonitoredObjectType of type MonitoredObjectType.BEAN_POOL is a singleton.
     *
     * @return true if this type of object can have atmost one instance within
     * its context, false otherwise.
     */
    public boolean isSingleton() {
        return isSingleton;
    }

    /**
     * A string representation. The return value of this method is same as that
     * of method getTypeName.
     *
     * @return A string representation of this MonitoredObjectType
     */
    @Override
    public String toString() {
        return typeName;
    }

    /**
     * Get a MonitoredObjectType instance for the specified string type.
     *
     * @param typeName string representing MonitoredObjectType
     * @throws IllegalArgumentException if the specified type name is not known.
     */
    public static MonitoredObjectType getMonitoredObjectType(String typeName) {
        MonitoredObjectType type = getMonitoredObjectTypeOrNull(typeName);
        if (type == null) {
            //String msg = localStrings.getString( "admin.monitor.unknown_type_name", typeName );
            String msg = "admin.monitor.unknown_type_name:" + typeName;
            throw new IllegalArgumentException(msg);
        }
        return type;
    }

    /**
     * Get a MonitoredObjectType instance for the specified string type. If the
     * specified type is not known, the method returns null.
     *
     * @param typeName string representing MonitoredObjectType
     */
    static MonitoredObjectType getMonitoredObjectTypeOrNull(String typeName) {
        MonitoredObjectType type = null;
        if (objectMap != null && typeName != null) {
            type = (MonitoredObjectType) objectMap.get(typeName);
        }
        return type;
    }
}
