content: /*
   * 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.state.kerberos;
  
  import java.util.Collection;
  import java.util.Map;
  
  /*
   * KerberosComponentDescriptor implements AbstractKerberosDescriptorContainer. It contains the data
   * related to a component which include the following properties:
   * <ul>
   * <li>name</li>
   * <li>identities</li>
   * <li>configurations</li>
   * </ul>
   * Example:
   * <pre>
   *  {
   *    "name" : "COMPONENT_NAME",
   *    "identities" : { ... },
   *    "configurations" : { ... }
   *  }
   *  </pre>
   */
  
  /**
   * KerberosComponentDescriptor is an implementation of an AbstractKerberosDescriptorContainer that
   * encapsulates the details about an Ambari component.
   * <p/>
   * A KerberosComponentDescriptor has the following properties:
   * <ul>
   * <li>identities ({@link org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptorContainer})</li>
   * <li>configurations ({@link org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptorContainer})</li>
   * </ul>
   * <p/>
   * The following (pseudo) JSON Schema will yield a valid KerberosComponentDescriptor
   * <pre>
   *   {
   *      "$schema": "http://json-schema.org/draft-04/schema#",
   *      "title": "KerberosComponentDescriptor",
   *      "description": "Describes an Ambari component",
   *      "type": "object",
   *      "properties": {
   *        "identities": {
   *          "description": "A list of Kerberos identity descriptors",
   *          "type": "array",
   *          "items": {
   *            "title": "KerberosIdentityDescriptor"
   *            "type": "{@link org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor}"
   *          }
   *        },
   *        "configurations": {
   *          "description": "A list of relevant configuration blocks",
   *          "type": "array",
   *          "items": {
   *            "title": "KerberosConfigurationDescriptor"
   *            "type": "{@link org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor}"
   *          }
   *        }
   *      }
   *   }
   * </pre>
   * <p/>
   * In this implementation,
   * {@link org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptor#name} will hold the
   * KerberosComponentDescriptor#name value
   */
  public class KerberosComponentDescriptor extends AbstractKerberosDescriptorContainer {
  
    /**
     * Creates a new KerberosComponentDescriptor
     * <p/>
     * See {@link org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor} for an
     * example JSON structure that may be used to generate this map.
     *
     * @param data a Map of values use to populate the data for the new instance
     * @see org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor
     */
    public KerberosComponentDescriptor(Map<?, ?> data) {
      super(data);
  
      // The name for this KerberosComponentDescriptor is stored in the "name" entry in the map
      // This is not automatically set by the super classes.
      setName(getStringValue(data, "name"));
    }
  
    @Override
    public Collection<? extends AbstractKerberosDescriptorContainer> getChildContainers() {
      // KerberosComponentDescriptors do not have child components
      return null;
    }
  
    @Override
    public AbstractKerberosDescriptorContainer getChildContainer(String name) {
      // KerberosComponentDescriptors do not have child components
      return null;
    }
  
    @Override
    public int hashCode() {
      return 35 * super.hashCode();
    }
  
    @Override
    public boolean equals(Object object) {
      return (object == this) ||
          (
              (object != null) &&
                  (object.getClass() == KerberosComponentDescriptor.class) &&
                  super.equals(object)
          );
    }
  }
  