/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed 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.onosproject.restconf.api;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;

import static javax.ws.rs.core.Response.Status;

/**
 * Exceptions raised during RESTCONF operations. This class extends
 * WebApplicationException. The design intention is to create a place holder
 * for RESTCONF specific errors and to be able to add more functions as the
 * subsystem grows.
 */
public class RestconfException extends WebApplicationException {

    // This is a randomly generated value. A WebApplicationException class is required to define it.
    private static final long SERIAL_VERSION_UID = 3275970397584007046L;

    /**
     * Constructs a new RESTCONF server error exception. The caller raising this
     * exception may pass in a HTTP error status code and an error message. The
     * error code will be displayed to the RESTCONF client as part of the
     * response from the RESTCONF server. The error message is a string which
     * may be saved in a log file and may be later retrieved by the
     * getMessage() method.
     *
     * @param message the detailed error message
     * @param status  HTTP error status
     * @throws IllegalArgumentException in case the status code is null or is not from
     *                                  javax.ws.rs.core.Response.Status.Family
     *                                  status code family
     */
    public RestconfException(String message, Status status) {
        super(message, null, Response.status(status).build());
    }

    /**
     * Constructs a new RESTCONF server error exception. The caller raising
     * this exception may pass in the numerical value of a HTTP error
     * status code, The error code will be displayed to the RESTCONF client
     * as a response from the RESTCONF server.
     *
     * @param status HTTP error status
     * @throws IllegalArgumentException in case the status code is not a valid
     *                                  HTTP status code or if it is not from the
     *                                  javax.ws.rs.core.Response.Status.Family
     *                                  status code family
     */
    public RestconfException(int status) {
        super((Throwable) null, Response.status(status).build());
    }
}
