/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.server.ws.rest;
import Sirius.server.dataretrieval.DataRetrievalException;
import Sirius.server.newuser.UserException;
import com.sun.jersey.api.client.ClientResponse;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.rmi.RemoteException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import de.cismet.tools.Converter;
/**
* DOCUMENT ME!
*
* @author martin.scholl@cismet.de
* @version $Revision$, $Date$
*/
public final class ServerExceptionMapper {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(ServerExceptionMapper.class);
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param t DOCUMENT ME!
* @param builder DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Response toResponse(final Throwable t, final Response.ResponseBuilder builder) {
final Response.ResponseBuilder response;
if (builder == null) {
response = Response.serverError();
} else {
response = builder;
}
if (t != null) {
try {
response.entity(Converter.serialiseToString(t));
} catch (final IOException ex) {
LOG.error("could not serialise throwable", ex); // NOI18N
}
}
return response.build();
}
/**
* DOCUMENT ME!
*
* @param <T> DOCUMENT ME!
* @param response DOCUMENT ME!
* @param type DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static <T extends Throwable> T fromResponse(final ClientResponse response, final Class<T> type) {
if (response != null) {
try {
return Converter.deserialiseFromString(response.getEntity(String.class), type);
} catch (final Exception e) {
LOG.warn("could not deserialise throwable", e); // NOI18N
}
}
return null;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
@Provider
public static final class DataRetrievalExceptionMapper implements ExceptionMapper<DataRetrievalException> {
//~ Methods ------------------------------------------------------------
@Override
public Response toResponse(final DataRetrievalException e) {
final Response.ResponseBuilder builder = Response.status(HttpStatus.SC_NOT_FOUND);
return ServerExceptionMapper.toResponse(e, builder);
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
@Provider
public static final class UserExceptionMapper implements ExceptionMapper<UserException> {
//~ Methods ------------------------------------------------------------
@Override
public Response toResponse(final UserException e) {
final Response.ResponseBuilder builder = Response.status(HttpStatus.SC_UNAUTHORIZED)
.header("WWW-Authenticate", "Username/Password realm=cidsServer"); // NOI18N
return ServerExceptionMapper.toResponse(e, builder);
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
@Provider
public static final class RemoteExceptionMapper implements ExceptionMapper<RemoteException> {
//~ Methods ------------------------------------------------------------
@Override
public Response toResponse(final RemoteException e) {
final Response.ResponseBuilder builder = Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR);
return ServerExceptionMapper.toResponse(e, builder);
}
}
}