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.controller.ivory;
  
  import java.util.Map;
  import java.util.Set;
  
  /**
   * Ivory cluster.
   */
  public class Cluster {
  
    private final String name;
    private final String colo;
    private final Set<Interface> interfaces;
    private final Set<Location> locations;
    private final Map<String, String> properties;
  
    /**
     * Construct a cluster.
     *
     * @param name        the cluster name
     * @param colo        the colo
     * @param interfaces  the interfaces
     * @param locations   the locations
     * @param properties  the properties
     */
    public Cluster(String name, String colo, Set<Interface> interfaces, Set<Location> locations, Map<String, String> properties) {
      this.name = name;
      this.colo = colo;
      this.interfaces = interfaces;
      this.locations = locations;
      this.properties = properties;
    }
  
    /**
     * Get the cluster name.
     *
     * @return the cluster name
     */
    public String getName() {
      return name;
    }
  
    /**
     * Get the colo.
     *
     * @return the colo
     */
    public String getColo() {
      return colo;
    }
  
    /**
     * Get the interfaces.
     *
     * @return the interfaces
     */
    public Set<Interface> getInterfaces() {
      return interfaces;
    }
  
    /**
     * Get the locations.
     *
     * @return the locations
     */
    public Set<Location> getLocations() {
      return locations;
    }
  
    /**
     * Get the properties.
     *
     * @return the properties
     */
    public Map<String, String> getProperties() {
      return properties;
    }
  
    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
  
      Cluster cluster = (Cluster) o;
  
      return !(colo != null       ? !colo.equals(cluster.colo)             : cluster.colo != null) &&
             !(interfaces != null ? !interfaces.equals(cluster.interfaces) : cluster.interfaces != null) &&
             !(locations != null  ? !locations.equals(cluster.locations)   : cluster.locations != null) &&
             !(name != null       ? !name.equals(cluster.name)             : cluster.name != null) &&
             !(properties != null ? !properties.equals(cluster.properties) : cluster.properties != null);
    }
  
    @Override
    public int hashCode() {
      int result = name != null ? name.hashCode() : 0;
      result = 31 * result + (colo != null ? colo.hashCode() : 0);
      result = 31 * result + (interfaces != null ? interfaces.hashCode() : 0);
      result = 31 * result + (locations != null ? locations.hashCode() : 0);
      result = 31 * result + (properties != null ? properties.hashCode() : 0);
      return result;
    }
  
    // ----- inner classes -----------------------------------------------------
  
    /**
     * Cluster interface.
     */
    public static class Interface {
  
      private final String type;
      private final String endpoint;
      private final String version;
  
      /**
       * Construct an interface.
       *
       * @param type      the type
       * @param endpoint  the endpoint
       * @param version   the version
       */
      public Interface(String type, String endpoint, String version) {
        this.type = type;
        this.endpoint = endpoint;
        this.version = version;
      }
  
      /**
       * Get the type.
       *
       * @return the type
       */
      public String getType() {
        return type;
      }
  
      /**
       * Get the endpoint.
       *
       * @return the endpoint
       */
      public String getEndpoint() {
        return endpoint;
      }
  
      /**
       * Get the version.
       *
       * @return the version
       */
      public String getVersion() {
        return version;
      }
  
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
  
        Interface that = (Interface) o;
  
        return !(endpoint != null ? !endpoint.equals(that.endpoint) : that.endpoint != null) &&
               !(type != null     ? !type.equals(that.type)         : that.type != null) &&
               !(version != null  ? !version.equals(that.version)   : that.version != null);
  
      }
  
      @Override
      public int hashCode() {
        int result = type != null ? type.hashCode() : 0;
        result = 31 * result + (endpoint != null ? endpoint.hashCode() : 0);
        result = 31 * result + (version != null ? version.hashCode() : 0);
        return result;
      }
    }
  
    /**
     * Cluster location
     */
    public static class Location {
      private final String name;
      private final String path;
  
      /**
       * Construct a location.
       *
       * @param name  the name
       * @param path  the path
       */
      public Location(String name, String path) {
        this.name = name;
        this.path = path;
      }
  
      /**
       * Get the name.
       *
       * @return the name
       */
      public String getName() {
        return name;
      }
  
      /**
       * Get the path.
       *
       * @return the path
       */
      public String getPath() {
        return path;
      }
  
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
  
        Location location = (Location) o;
  
        return !(name != null ? !name.equals(location.name) : location.name != null) &&
               !(path != null ? !path.equals(location.path) : location.path != null);
  
      }
  
      @Override
      public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (path != null ? path.hashCode() : 0);
        return result;
      }
    }
  }
  