package org.genedb.crawl.view; import org.apache.log4j.Logger; import org.springframework.core.Ordered; import org.springframework.util.Assert; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; import java.util.Arrays; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; public class CrawlViewResolver implements ViewResolver, Ordered { private Logger logger = Logger.getLogger(CrawlViewResolver.class); private Map<String, View> viewMap; public void setViewMap(Map<String, View> viewMap) { this.viewMap = viewMap; } private int order; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { String[] viewSplit = viewName.split(":"); if (viewSplit.length < 1) { return null; } @SuppressWarnings("unused") String prefix = viewSplit[0]; //logger.info(String.format("prefix: '%s'", prefix)); String extensionViewName = ""; if (viewSplit.length == 2) { extensionViewName = viewSplit[1]; } else { extensionViewName = getExtension(); } View view = viewMap.get(extensionViewName); // logger.info(String.format("Returning view of type '%s'", // view.getClass())); return view; } /** * Generates and appropriate extension based on the existing HTTP request. * * @param request * @return */ private String getExtension() { RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); Assert.isInstanceOf(ServletRequestAttributes.class, attrs); ServletRequestAttributes servletAttrs = (ServletRequestAttributes) attrs; HttpServletRequest request = servletAttrs.getRequest(); String uri = request.getRequestURI(); String extension = "xml"; if (uri.endsWith(".json")) { extension = "json"; } StringBuilder sb = new StringBuilder (uri); String sep = " - "; @SuppressWarnings("unchecked") Map<String, String[]> parameters = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameters.entrySet()) { sb.append(sep + entry.getKey() + " : " + Arrays.asList(entry.getValue()).toString()); sep = ", "; } logger.info(sb.toString()); return extension; } public void setOrder(int order) { this.order = order; } @Override public int getOrder() { return order; } }