package com.revolsys.ui.web.rest.interceptor; import java.io.IOException; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.servlet.view.AbstractView; import com.revolsys.ui.web.controller.PathViewController; public class HttpMessageConverterView extends AbstractView { private static final String NAME = HttpMessageConverterView.class.getName(); public static HttpMessageConverterView getMessageConverterView() { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); final HttpMessageConverterView view = (HttpMessageConverterView)requestAttributes .getAttribute(NAME, RequestAttributes.SCOPE_REQUEST); return view; } private final MediaType mediaType; private final HttpMessageConverter<Object> messageConverter; private final Object returnValue; public HttpMessageConverterView(final HttpMessageConverter messageConverter, final MediaType mediaType, final Object returnValue) { this.messageConverter = messageConverter; this.mediaType = mediaType; this.returnValue = returnValue; } public MediaType getMediaType() { return this.mediaType; } public HttpMessageConverter<Object> getMessageConverter() { return this.messageConverter; } public Object getReturnValue() { return this.returnValue; } public void render(final HttpServletResponse response) throws IOException { this.messageConverter.write(this.returnValue, this.mediaType, new ServletServerHttpResponse(response)); } @Override protected void renderMergedOutputModel(final Map<String, Object> model, final HttpServletRequest request, final HttpServletResponse response) throws Exception { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); final String path = (String)requestAttributes.getAttribute("httpMessageConverterTemplatePath", RequestAttributes.SCOPE_REQUEST); if (path == null || !Arrays.asList(MediaType.TEXT_HTML, MediaType.APPLICATION_XHTML_XML) .contains(this.mediaType)) { render(response); } else { final Charset charSet = this.mediaType.getCharSet(); if (charSet == null) { response.setContentType(this.mediaType.toString() + "; charset=UTF-8"); } else { response.setContentType(this.mediaType.toString()); } final HttpMessageConverterView savedView = getMessageConverterView(); requestAttributes.setAttribute(NAME, this, RequestAttributes.SCOPE_REQUEST); if (!PathViewController.include(request, response, path)) { render(response); } requestAttributes.setAttribute(NAME, savedView, RequestAttributes.SCOPE_REQUEST); } } }