package org.jboss.resteasy.springmvc;
import org.jboss.resteasy.core.ResourceInvoker;
import org.jboss.resteasy.core.SynchronousDispatcher;
import org.jboss.resteasy.plugins.spring.i18n.LogMessages;
import org.jboss.resteasy.plugins.spring.i18n.Messages;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.ResteasyDeployment;
import org.jboss.resteasy.util.HttpResponseCodes;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.NotAcceptableException;
import javax.ws.rs.NotAllowedException;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.NotSupportedException;
import javax.ws.rs.core.Response;
/**
* @author <a href="mailto:sduskis@gmail.com">Solomon Duskis</a>
* @version $Revision: 1 $
*/
public class ResteasyHandlerMapping implements HandlerMapping, Ordered, InitializingBean
{
private int order = Integer.MAX_VALUE;
private SynchronousDispatcher dispatcher;
private String prefix = "";
private HandlerInterceptor[] interceptors;
private boolean throwNotFound = false;
public ResteasyHandlerMapping(ResteasyDeployment deployment)
{
super();
this.dispatcher = (SynchronousDispatcher)deployment.getDispatcher();
}
public SynchronousDispatcher getDispatcher()
{
return dispatcher;
}
public void setOrder(int order)
{
this.order = order;
}
public HandlerInterceptor[] getInterceptors()
{
return interceptors;
}
public void setInterceptors(HandlerInterceptor[] interceptors)
{
this.interceptors = interceptors;
}
public HandlerExecutionChain getHandler(HttpServletRequest request)
throws Exception
{
ResteasyRequestWrapper requestWrapper = RequestUtil.getRequestWrapper(
request, request.getMethod(), prefix);
try
{
// NOTE: if invoker isn't found, RESTEasy throw NoReourceFoundFailure
HttpRequest httpRequest = requestWrapper.getHttpRequest();
if (!httpRequest.isInitial())
{
String message = Messages.MESSAGES.pathNotInitialRequest(httpRequest.getUri().getPath());
LogMessages.LOGGER.error(message);
requestWrapper.setError(500, message);
}
else
{
Response response = dispatcher.preprocess(httpRequest);
if (response != null)
{
requestWrapper.setAbortedResponse(response);
}
else
{
requestWrapper.setInvoker(getInvoker(httpRequest));
}
}
return new HandlerExecutionChain(requestWrapper, interceptors);
}
catch (NotFoundException e)
{
if (throwNotFound)
{
throw e;
}
LogMessages.LOGGER.error(Messages.MESSAGES.resourceNotFound(e.getMessage()), e);
}
catch (NotAcceptableException na) {
requestWrapper.setError(HttpResponseCodes.SC_NOT_ACCEPTABLE, Messages.MESSAGES.requestedMediaNotAcceptable());
return new HandlerExecutionChain(requestWrapper, interceptors);
}
catch (NotAllowedException na) {
requestWrapper.setError(HttpResponseCodes.SC_METHOD_NOT_ALLOWED, Messages.MESSAGES.notAllowed());
return new HandlerExecutionChain(requestWrapper, interceptors);
}
catch (NotSupportedException nse) {
requestWrapper.setError(HttpResponseCodes.SC_UNSUPPORTED_MEDIA_TYPE, Messages.MESSAGES.notSupported());
return new HandlerExecutionChain(requestWrapper, interceptors);
}
catch (Failure e)
{
LogMessages.LOGGER.error(Messages.MESSAGES.resourceFailure(e.getMessage()), e);
throw e;
}
return null;
}
private ResourceInvoker getInvoker(HttpRequest httpRequest)
{
if (dispatcher != null)
return dispatcher.getInvoker(httpRequest);
return null;
}
public int getOrder()
{
return order;
}
public boolean isThrowNotFound()
{
return throwNotFound;
}
public void setThrowNotFound(boolean throwNotFound)
{
this.throwNotFound = throwNotFound;
}
public String getPrefix()
{
return prefix;
}
public void setPrefix(String prefix)
{
this.prefix = prefix;
}
public void afterPropertiesSet() throws Exception
{
if (!throwNotFound && order == Integer.MAX_VALUE)
{
LogMessages.LOGGER.info(Messages.MESSAGES.resteasyHandlerMappingHasDefaultOrder());
}
}
}