/*******************************************************************************
 * Copyright (c) 2013, 2014 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *      gonural - initial implementation
 ******************************************************************************/
package org.eclipse.persistence.jpa.rs.exceptions;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.jpa.rs.ReservedWords;

/*
 * 
 * Model class for marshaling error response
 * 
 */
@XmlRootElement(name = ReservedWords.ERROR_RESPONSE_LABEL)
@XmlType(propOrder = { "problemType", "title", "httpStatus", "detail", "problemInstance", "errorCode", "errorPath", "errorDetails", "requestId" })
/*
 *    {
 *        "$schema": "http://json-schema.org/draft-04/schema#",
 *        "id": "rest-schemas/exception#",
 *        "title": "Error Detail",
 *        "description": "This complex type is used to capture the error detail during REST calls",
 *        "type": "object",
 *        "properties": {
 *              "problemType": {
 *                   "type": "string",
 *                   "description": "An absolute URI that identifies the problem type.  When dereferenced, it SHOULD provide human-readable documentation for the problem type (e.g., using HTML)."
 *               },
 *               "title": {
 *                   "type": "string",
 *                   "description": "A short, human-readable summary of the problem type.  It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localisation."
 *               },
 *               "httpStatus": {
 *                   "type": "integer",
 *                   "description": "The HTTP status code set by the origin server for this occurrence of the problem."
 *               },
 *               "detail": {
 *                   "type": "string",
 *                    "description": "An human readable explanation specific to this occurrence of the problem."
 *               },
 *               "problemInstance": {
 *                   "type": "string",
 *                    "description": "An absolute URI that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced."
 *               },
 *               "errorCode": {
 *                   "type": "string",
 *                    "description": "application error code, which is different from HTTP error code"
 *               },
 *               "errorPath": {
 *                   "type": "string",
 *                   "description": "path to the problem, it could be at a resource level, or maybe at property level"
 *               },
 *               "errorDetails": {
 *                   "$ref": "rest-schemas/exception#",
 *                   "description": "contains details of the error message. This is basically a hierarchical tree structure."
 *               }
 *        },
 *        "required": ["problemType", "title"]
 *    }
 */
public class ErrorResponse {
    private String problemType; // mandatory
    private String title; // mandatory
    private int httpStatus;
    private String detail;
    private String problemInstance;
    private String errorCode;
    private String errorPath;
    private ErrorResponse errorDetails;
    private String requestId;

    /**
     * Instantiates a new error response.
     */
    public ErrorResponse() {
    }

    /**
     * Instantiates a new error response.
     *
     * @param problemType the problem type
     * @param title the title
     * @param errorCode the error code
     */
    public ErrorResponse(String problemType, String title, String errorCode) {
        this.problemType = problemType;
        this.title = title;
        this.errorCode = errorCode;
    }

    /**
     * Gets the problem type.
     *
     * @return the problem type
     */
    public String getProblemType() {
        return problemType;
    }

    /**
     * Sets the problem type.
     *
     * @param problemType the new problem type
     */
    public void setProblemType(String problemType) {
        this.problemType = problemType;
    }

    /**
     * Gets the title.
     *
     * @return the title
     */
    public String getTitle() {
        return title;
    }

    /**
     * Sets the title.
     *
     * @param title the new title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * Gets the http status.
     *
     * @return the http status
     */
    public int getHttpStatus() {
        return httpStatus;
    }

    /**
     * Sets the http status.
     *
     * @param httpStatus the new http status
     */
    public void setHttpStatus(int httpStatus) {
        this.httpStatus = httpStatus;
    }

    /**
     * Gets the detail.
     *
     * @return the detail
     */
    public String getDetail() {
        return detail;
    }

    /**
     * Sets the detail.
     *
     * @param detail the new detail
     */
    public void setDetail(String detail) {
        this.detail = detail;
    }

    /**
     * Gets the problem instance.
     *
     * @return the problem instance
     */
    public String getProblemInstance() {
        return problemInstance;
    }

    /**
     * Sets the problem instance.
     *
     * @param problemInstance the new problem instance
     */
    public void setProblemInstance(String problemInstance) {
        this.problemInstance = problemInstance;
    }

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

    /**
     * Sets the error code.
     *
     * @param errorCode the new error code
     */
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    /**
     * Gets the error path.
     *
     * @return the error path
     */
    public String getErrorPath() {
        return errorPath;
    }

    /**
     * Sets the error path.
     *
     * @param errorPath the new error path
     */
    public void setErrorPath(String errorPath) {
        this.errorPath = errorPath;
    }

    /**
     * Gets the error details.
     *
     * @return the error details
     */
    public ErrorResponse getErrorDetails() {
        return errorDetails;
    }

    /**
     * Sets the error details.
     *
     * @param errorDetails the new error details
     */
    public void setErrorDetails(ErrorResponse errorDetails) {
        this.errorDetails = errorDetails;
    }

    /**
     * Gets the request id.
     *
     * @return the request id
     */
    public String getRequestId() {
        return requestId;
    }

    /**
     * Sets the request unique id.
     *
     * @param requestId the new request unique id
     */
    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }
}
