/**
 * 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.atlas.web.resources;

import org.apache.atlas.catalog.exception.CatalogException;
import org.apache.atlas.web.util.Servlets;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Exception mapper for CatalogException.
 */
@Provider
public class CatalogExceptionMapper implements ExceptionMapper<CatalogException> {
    @Override
    public Response toResponse(CatalogException e) {
        return Response.status(e.getStatus()).entity(
                new ErrorBean(e)).type(Servlets.JSON_MEDIA_TYPE).build();
    }

    @XmlRootElement
    public static class ErrorBean {
        public int status;
        public String message;

        public ErrorBean() {
            // required for JAXB
        }

        public ErrorBean(CatalogException ex) {
            this.status = ex.getStatus();
            this.message = ex.getMessage();
        }

        public int getStatus() {
            return status;
        }

        public String getMessage() {
            return message;
        }
    }
}
