/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.jboss.rest;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import javax.ws.rs.NotAuthorizedException;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.jboss.resteasy.spi.InternalServerErrorException;
@Provider
public class TeiidRSExceptionHandler implements ExceptionMapper<Exception> {
@Context
protected HttpHeaders httpHeaders;
@Override
public Response toResponse(Exception e) {
ResponseError error = new ResponseError();
String code = "ERROR"; //$NON-NLS-1$
if(e instanceof NotAuthorizedException){
code = "401"; //$NON-NLS-1$
} else if(e instanceof NotFoundException){
code = "404"; //$NON-NLS-1$
} else if(e instanceof InternalServerErrorException) {
code = "500"; //$NON-NLS-1$
} else if(e instanceof WebApplicationException) {
code = "500"; //$NON-NLS-1$
}
error.setCode(code);
error.setMessage(e.getMessage());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
error.setDetails(sw.toString());
String type = MediaType.APPLICATION_XML;
List<MediaType> acceptTypes = httpHeaders.getAcceptableMediaTypes();
if(acceptTypes != null){
for (MediaType acceptType : acceptTypes){
if (isApplicationJsonWithParametersIgnored(acceptType)) {
type = MediaType.APPLICATION_JSON;
break;
}
}
}
return Response.serverError().entity(error).type(type).build();
}
private boolean isApplicationJsonWithParametersIgnored(MediaType acceptType) {
return acceptType.getType().equals(MediaType.APPLICATION_JSON_TYPE.getType()) &&
acceptType.getSubtype().equals(MediaType.APPLICATION_JSON_TYPE.getSubtype());
}
@XmlRootElement(name = "error") //$NON-NLS-1$
@XmlType(propOrder = { "code", "message", "details"}) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
public static class ResponseError {
private String code;
private String message;
private String details;
@XmlElement(name = "code") //$NON-NLS-1$
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@XmlElement(name = "message") //$NON-NLS-1$
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@XmlElement(name = "details") //$NON-NLS-1$
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
}