/**
 * 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.hcatalog.common;

import java.io.IOException;

/**
 * Class representing exceptions thrown by HCat.
 */
public class HCatException extends IOException {

  private static final long serialVersionUID = 1L;

  /** The error type enum for this exception. */
  private final ErrorType errorType;

  /**
   * Instantiates a new hcat exception.
   * @param errorType the error type
   */
  public HCatException(ErrorType errorType) {
    this(errorType, null, null);
  }


  /**
   * Instantiates a new hcat exception.
   * @param errorType the error type
   * @param cause the cause
   */
  public HCatException(ErrorType errorType, Throwable cause) {
    this(errorType, null, cause);
  }

  /**
   * Instantiates a new hcat exception.
   * @param errorType the error type
   * @param extraMessage extra messages to add to the message string
   */
  public HCatException(ErrorType errorType, String extraMessage) {
    this(errorType, extraMessage, null);
  }

  /**
   * Instantiates a new hcat exception.
   * @param errorType the error type
   * @param extraMessage extra messages to add to the message string
   * @param cause the cause
   */
  public HCatException(ErrorType errorType, String extraMessage, Throwable cause) {
    super(buildErrorMessage(
        errorType,
        extraMessage,
        cause), cause);
    this.errorType = errorType;
  }


  //TODO : remove default error type constructors after all exceptions
  //are changed to use error types
  /**
   * Instantiates a new hcat exception.
   * @param message the error message
   */
  public HCatException(String message) {
    this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, null);
  }

  /**
   * Instantiates a new hcat exception.
   * @param message the error message
   * @param cause the cause
   */
  public HCatException(String message, Throwable cause) {
    this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, cause);
  }


  /**
   * Builds the error message string. The error type message is appended with the extra message. If appendCause
   * is true for the error type, then the message of the cause also is added to the message.
   * @param type the error type
   * @param extraMessage the extra message string
   * @param cause the cause for the exception
   * @return the exception message string
   */
  public static String buildErrorMessage(ErrorType type, String extraMessage, Throwable cause) {

    //Initial message is just the error type message
    StringBuffer message = new StringBuffer(HCatException.class.getName());
    message.append(" : " + type.getErrorCode());
    message.append(" : " + type.getErrorMessage());

    if( extraMessage != null ) {
      //Add the extra message value to buffer
      message.append(" : " + extraMessage);
    }

    if( type.appendCauseMessage() ) {
      if( cause != null ) {
        //Add the cause message to buffer
        message.append(". Cause : " + cause.toString());
      }
    }

    return message.toString();
  }


  /**
   * Is this a retriable error.
   * @return is it retriable
   */
  public boolean isRetriable() {
    return errorType.isRetriable();
  }

  /**
   * Gets the error type.
   * @return the error type enum
   */
  public ErrorType getErrorType() {
    return errorType;
  }

  /**
   * Gets the error code.
   * @return the error code
   */
  public int getErrorCode() {
    return errorType.getErrorCode();
  }

  /* (non-Javadoc)
   * @see java.lang.Throwable#toString()
   */
  @Override
  public String toString() {
    return getMessage();
  }

}
