Java tutorial
/* * infoScoop OpenSource * Copyright (C) 2010 Beacon IT Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/lgpl-3.0-standalone.html>. */ package org.infoscoop.api.oauth2.provider; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.security.oauth2.http.converter.jaxb.JaxbOAuth2ExceptionMessageConverter; import org.springframework.security.oauth2.provider.error.OAuth2ExceptionRenderer; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; public class ISOAuth2ExceptionRenderer implements OAuth2ExceptionRenderer { private static Log log = LogFactory.getLog(ISOAuth2ExceptionRenderer.class); private List<HttpMessageConverter<?>> messageConverters = geDefaultMessageConverters(); public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) { this.messageConverters = messageConverters; } public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) throws Exception { if (responseEntity == null) { return; } HttpInputMessage inputMessage = createHttpInputMessage(webRequest); HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); HttpStatus statusCode = null; if (responseEntity instanceof ResponseEntity && outputMessage instanceof ServerHttpResponse) { statusCode = ((ResponseEntity<?>) responseEntity).getStatusCode(); ((ServerHttpResponse) outputMessage).setStatusCode(statusCode); } HttpHeaders entityHeaders = responseEntity.getHeaders(); if (!entityHeaders.isEmpty()) { outputMessage.getHeaders().putAll(entityHeaders); } Object body = responseEntity.getBody(); if (body != null) { writeWithMessageConverters(body, inputMessage, outputMessage, statusCode, webRequest.getRequest()); } else { // flush headers outputMessage.getBody(); } } @SuppressWarnings({ "unchecked", "rawtypes" }) private void writeWithMessageConverters(Object returnValue, HttpInputMessage inputMessage, HttpOutputMessage outputMessage, HttpStatus status, HttpServletRequest request) throws IOException, HttpMediaTypeNotAcceptableException { log.info(request.getRemoteAddr() + " " + returnValue + " " + status.value()); Class<?> returnValueType = returnValue.getClass(); List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>(); String fileType = request.getPathInfo(); MediaType acceptedMediaType = MediaType.APPLICATION_JSON; if (fileType.substring(fileType.lastIndexOf(".") + 1).equals("xml")) acceptedMediaType = MediaType.APPLICATION_XML; for (HttpMessageConverter messageConverter : messageConverters) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { messageConverter.write(returnValue, acceptedMediaType, outputMessage); if (log.isDebugEnabled()) { MediaType contentType = outputMessage.getHeaders().getContentType(); if (contentType == null) { contentType = acceptedMediaType; } log.debug("Written [" + returnValue + "] as \"" + contentType + "\" using [" + messageConverter + "]"); } return; } } for (HttpMessageConverter messageConverter : messageConverters) { allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes()); } throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes); } private List<HttpMessageConverter<?>> geDefaultMessageConverters() { List<HttpMessageConverter<?>> result = new ArrayList<HttpMessageConverter<?>>(); result.addAll(new RestTemplate().getMessageConverters()); result.add(new JaxbOAuth2ExceptionMessageConverter()); return result; } private HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); return new ServletServerHttpRequest(servletRequest); } private HttpOutputMessage createHttpOutputMessage(NativeWebRequest webRequest) throws Exception { HttpServletResponse servletResponse = (HttpServletResponse) webRequest.getNativeResponse(); return new ServletServerHttpResponse(servletResponse); } }