package org.jibeframework.core.app.request;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jibeframework.core.Context;
import org.jibeframework.core.util.JibeUtil;
import org.springframework.util.PatternMatchUtils;
/**
* Request handler which is facade toward Spring MVC implementation
*
* @author dhalupa
*
*/
public class JibeMvcRequestHandler implements RequestHandler {
private static final Log logger = LogFactory.getLog(JibeMvcRequestHandler.class);
private JibeSpringMvcDispatcher dispatcher;
private String[] publicPattern = { "public/*", "jsloader", "cssloader" };
public JibeMvcRequestHandler(JibeSpringMvcDispatcher dispatcher) {
this.dispatcher = dispatcher;
}
// It will always be last in the pipeline
public boolean applies(Context context) {
return true;
}
public boolean shouldAuthenticate(Context context) {
return !PatternMatchUtils.simpleMatch(publicPattern, context.getExtensionPath());
}
public void handleRequest(Context context) {
HttpServletRequest request = new JibeServletRequestWrapper(context.getServletRequest());
HttpServletResponse servletResponse = context.getServletResponse();
try {
dispatcher.service(request, servletResponse);
} catch (Exception e) {
handleException(e, context);
}
}
public void handleAuthenticationFailed(Context context) {
context.getServletResponse().setContentType("text/html");
context.getServletResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
try {
context.getServletResponse().getOutputStream().flush();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
public void handleException(Exception e, Context context) {
Throwable root = JibeUtil.getRootCause(e);
context.getServletResponse().setContentType("text/html");
context.getServletResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
try {
context.getServletResponse().getOutputStream().write(root.getMessage().getBytes());
context.getServletResponse().getOutputStream().flush();
} catch (IOException e1) {
} finally {
logger.error(root.getMessage(), root);
}
}
}