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.view.validation;
  
  import java.util.Map;
  
  import org.apache.ambari.view.validation.ValidationResult;
  
  import com.google.gson.Gson;
  
  /**
   * View instance validation result.  This result includes the validation results
   * for the associated view instance and its properties.
   */
  public class InstanceValidationResultImpl extends ValidationResultImpl {
  
    /**
     * Static Gson instance.
     */
    private static final Gson GSON = new Gson();
  
    /**
     * The validation results for the associated instance's properties
     */
    private final Map<String, ValidationResult> propertyResults;
  
  
    // ----- Constructors ------------------------------------------------------
  
    /**
     * Construct an instance validation result.
     *
     * @param instanceResult   the results of the instance validation
     * @param propertyResults  the results of the property validations
     */
    public InstanceValidationResultImpl(ValidationResult instanceResult, Map<String, ValidationResult> propertyResults) {
      super(isValid(instanceResult, propertyResults), getDetail(instanceResult, propertyResults));
      this.propertyResults = propertyResults;
    }
  
  
    // ----- InstanceValidationResultImpl --------------------------------------
  
    /**
     * Get the validation results for the properties of the associated instance.
     *
     * @return the property validation results
     */
    public Map<String, ValidationResult> getPropertyResults() {
      return propertyResults;
    }
  
    /**
     * Return this result as a JSON string.
     *
     * @return this result in JSON format
     */
    public String toJson() {
      return GSON.toJson(this);
    }
  
  
    // ----- helper methods ----------------------------------------------------
  
    // determine whether or not the given instance and property results are valid
    private static boolean isValid(ValidationResult instanceResult, Map<String, ValidationResult> propertyResults) {
      boolean instanceValid = instanceResult.isValid();
      if (instanceValid) {
        for (Map.Entry<String, ValidationResult> entry : propertyResults.entrySet()) {
          ValidationResult propertyResult = entry.getValue();
          if (propertyResult != null && !propertyResult.isValid()) {
            return false;
          }
        }
      }
      return instanceValid;
    }
  
    // get a detail message from the given instance and property results
    private static String getDetail(ValidationResult instanceResult, Map<String, ValidationResult> propertyResults) {
      if (instanceResult.isValid()) {
        for (Map.Entry<String, ValidationResult> entry : propertyResults.entrySet()) {
          ValidationResult propertyResult = entry.getValue();
          if (propertyResult != null && !propertyResult.isValid()) {
            return "The instance has invalid properties.";
          }
        }
      }
      return instanceResult.getDetail();
    }
  }
  