/**
 * 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();
    }

}
