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

import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Role defines the components that are available to Ambari.  It has a few
 * similar mechanisms to an enum.
 */
public class Role {
  
  private static final Map<String, Role> roles = new ConcurrentHashMap<String, Role>();
  
  /**
   * @param name the role name
   * @return a Role instance, never <code>null</code>
   */
  public static Role valueOf(String name) {
    if (roles.containsKey(name)) {
      return roles.get(name);
    }

    Role role = new Role(name);
    roles.put(name, role);
    return role;    
  }
  
  /**
   * @return a collection of all defined Role instances
   */
  public static Collection<Role> values() {
    return Collections.unmodifiableCollection(roles.values());
  }  
  
  public static final Role AMBARI_SERVER_ACTION = valueOf("AMBARI_SERVER_ACTION"); 
  public static final Role DATANODE = valueOf("DATANODE");
  public static final Role FLUME_HANDLER = valueOf("FLUME_HANDLER");
  public static final Role FLUME_SERVICE_CHECK = valueOf("FLUME_SERVICE_CHECK");
  public static final Role GANGLIA_MONITOR = valueOf("GANGLIA_MONITOR");
  public static final Role GANGLIA_SERVER = valueOf("GANGLIA_SERVER");
  public static final Role HBASE_CLIENT = valueOf("HBASE_CLIENT");
  public static final Role HBASE_MASTER = valueOf("HBASE_MASTER");
  public static final Role HBASE_REGIONSERVER = valueOf("HBASE_REGIONSERVER");
  public static final Role HBASE_SERVICE_CHECK = valueOf("HBASE_SERVICE_CHECK");
  public static final Role HCAT = valueOf("HCAT");
  public static final Role HCAT_SERVICE_CHECK = valueOf("HCAT_SERVICE_CHECK");
  public static final Role GLUSTERFS_CLIENT = valueOf("GLUSTERFS_CLIENT");
  public static final Role GLUSTERFS_SERVICE_CHECK = valueOf("GLUSTERFS_SERVICE_CHECK");
  public static final Role HDFS_CLIENT = valueOf("HDFS_CLIENT");
  public static final Role HDFS_SERVICE_CHECK = valueOf("HDFS_SERVICE_CHECK");
  public static final Role HISTORYSERVER = valueOf("HISTORYSERVER");
  public static final Role HIVE_CLIENT = valueOf("HIVE_CLIENT");
  public static final Role HIVE_METASTORE = valueOf("HIVE_METASTORE");
  public static final Role HIVE_SERVER = valueOf("HIVE_SERVER");
  public static final Role HIVE_SERVICE_CHECK = valueOf("HIVE_SERVICE_CHECK");
  public static final Role JOBTRACKER = valueOf("JOBTRACKER");
  public static final Role NODEMANAGER = valueOf("NODEMANAGER");
  public static final Role OOZIE_CLIENT = valueOf("OOZIE_CLIENT");
  public static final Role OOZIE_SERVER = valueOf("OOZIE_SERVER");
  public static final Role PEERSTATUS = valueOf("PEERSTATUS");
  public static final Role PIG = valueOf("PIG");
  public static final Role PIG_SERVICE_CHECK = valueOf("PIG_SERVICE_CHECK");
  public static final Role RESOURCEMANAGER = valueOf("RESOURCEMANAGER");
  public static final Role SECONDARY_NAMENODE = valueOf("SECONDARY_NAMENODE");
  public static final Role SQOOP = valueOf("SQOOP");
  public static final Role SQOOP_SERVICE_CHECK = valueOf("SQOOP_SERVICE_CHECK");
  public static final Role HUE_SERVER = valueOf("HUE_SERVER");
  public static final Role JOURNALNODE = valueOf("JOURNALNODE");
  public static final Role MAPREDUCE_CLIENT = valueOf("MAPREDUCE_CLIENT");
  public static final Role MAPREDUCE_SERVICE_CHECK = valueOf("MAPREDUCE_SERVICE_CHECK");
  public static final Role MAPREDUCE2_SERVICE_CHECK = valueOf("MAPREDUCE2_SERVICE_CHECK");
  public static final Role MYSQL_SERVER = valueOf("MYSQL_SERVER");
  public static final Role NAMENODE = valueOf("NAMENODE");
  public static final Role NAMENODE_SERVICE_CHECK = valueOf("NAMENODE_SERVICE_CHECK");
  public static final Role OOZIE_SERVICE_CHECK = valueOf("OOZIE_SERVICE_CHECK");
  public static final Role TASKTRACKER = valueOf("TASKTRACKER");
  public static final Role WEBHCAT_SERVER = valueOf("WEBHCAT_SERVER");
  public static final Role WEBHCAT_SERVICE_CHECK = valueOf("WEBHCAT_SERVICE_CHECK");
  public static final Role YARN_SERVICE_CHECK = valueOf("YARN_SERVICE_CHECK");
  public static final Role ZKFC = valueOf("ZKFC");
  public static final Role ZOOKEEPER_CLIENT = valueOf("ZOOKEEPER_CLIENT");
  public static final Role ZOOKEEPER_QUORUM_SERVICE_CHECK = valueOf("ZOOKEEPER_QUORUM_SERVICE_CHECK");
  public static final Role ZOOKEEPER_SERVER = valueOf("ZOOKEEPER_SERVER");
  public static final Role FALCON_SERVICE_CHECK = valueOf("FALCON_SERVICE_CHECK");
  public static final Role STORM_SERVICE_CHECK = valueOf("STORM_SERVICE_CHECK");
  public static final Role YARN_CLIENT = valueOf("YARN_CLIENT");
  public static final Role KDC_SERVER = valueOf("KDC_SERVER");
  public static final Role KERBEROS_CLIENT = valueOf("KERBEROS_CLIENT");
  public static final Role KERBEROS_SERVICE_CHECK = valueOf("KERBEROS_SERVICE_CHECK");
  public static final Role METRICS_COLLECTOR = valueOf("METRICS_COLLECTOR");
  public static final Role METRICS_MONITOR = valueOf("METRICS_MONITOR");
  public static final Role AMS_SERVICE_CHECK = valueOf("AMBARI_METRICS_SERVICE_CHECK");

  private String name = null;
  
  private Role(String roleName) {
    name = roleName;
  }
  
  /**
   * @return the name given to the role
   */
  public String name() {
    return name;
  }

  @Override
  public String toString() {
    return name;
  }
  
  @Override
  public int hashCode() {
    return name.hashCode();
  }

  @Override
  public boolean equals(Object o) {
    if (null == o || !Role.class.equals(o.getClass())) {
      return false;
    }
    
    return this == o || name.equals(((Role) o).name);
  }

}
