@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2012 the original author or authors .
* Copyright 2002 - 2014 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -22,7 +22,6 @@ import java.util.Collections;
@@ -22,7 +22,6 @@ import java.util.Collections;
import java.util.LinkedHashSet ;
import java.util.List ;
import java.util.Set ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
@ -41,8 +40,8 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
@@ -41,8 +40,8 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerMapping ;
/ * *
* Extends { @link AbstractMessageConverterMethodArgumentResolver } with the ability to handle method return
* values by writing to the response with { @link HttpMessageConverter } s .
* Extends { @link AbstractMessageConverterMethodArgumentResolver } with the ability to handle
* method return values by writing to the response with { @link HttpMessageConverter } s .
*
* @author Arjen Poutsma
* @author Rossen Stoyanchev
@ -55,6 +54,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -55,6 +54,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
private final ContentNegotiationManager contentNegotiationManager ;
protected AbstractMessageConverterMethodProcessor ( List < HttpMessageConverter < ? > > messageConverters ) {
this ( messageConverters , null ) ;
}
@ -63,12 +63,12 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -63,12 +63,12 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
ContentNegotiationManager manager ) {
super ( messageConverters ) ;
this . contentNegotiationManager = ( manager ! = null ) ? manager : new ContentNegotiationManager ( ) ;
this . contentNegotiationManager = ( manager ! = null ? manager : new ContentNegotiationManager ( ) ) ;
}
/ * *
* Creates a new { @link HttpOutputMessage } from the given { @link NativeWebRequest } .
*
* @param webRequest the web request to create an output message from
* @return the output message
* /
@ -81,10 +81,9 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -81,10 +81,9 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
* Writes the given return value to the given web request . Delegates to
* { @link # writeWithMessageConverters ( Object , MethodParameter , ServletServerHttpRequest , ServletServerHttpResponse ) }
* /
protected < T > void writeWithMessageConverters ( T returnValue ,
MethodParameter returnType ,
NativeWebRequest webRequest )
protected < T > void writeWithMessageConverters ( T returnValue , MethodParameter returnType , NativeWebRequest webRequest )
throws IOException , HttpMediaTypeNotAcceptableException {
ServletServerHttpRequest inputMessage = createInputMessage ( webRequest ) ;
ServletServerHttpResponse outputMessage = createOutputMessage ( webRequest ) ;
writeWithMessageConverters ( returnValue , returnType , inputMessage , outputMessage ) ;
@ -92,7 +91,6 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -92,7 +91,6 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
/ * *
* Writes the given return type to the given output message .
*
* @param returnValue the value to write to the output message
* @param returnType the type of the value
* @param inputMessage the input messages . Used to inspect the { @code Accept } header .
@ -102,23 +100,20 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -102,23 +100,20 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
* the request cannot be met by the message converters
* /
@SuppressWarnings ( "unchecked" )
protected < T > void writeWithMessageConverters ( T returnValue ,
MethodParameter returnType ,
ServletServerHttpRequest inputMessage ,
ServletServerHttpResponse outputMessage )
protected < T > void writeWithMessageConverters ( T returnValue , MethodParameter returnType ,
ServletServerHttpRequest inputMessage , ServletServerHttpResponse outputMessage )
throws IOException , HttpMediaTypeNotAcceptableException {
Class < ? > returnValueClass = returnValue . getClass ( ) ;
HttpServletRequest servletRequest = inputMessage . getServletRequest ( ) ;
List < MediaType > requestedMediaTypes = getAcceptableMediaTypes ( servletRequest ) ;
List < MediaType > producibleMediaTypes = getProducibleMediaTypes ( servletRequest , returnValueClass ) ;
Set < MediaType > compatibleMediaTypes = new LinkedHashSet < MediaType > ( ) ;
for ( MediaType r : requestedMediaTypes ) {
for ( MediaType p : producibleMediaTypes ) {
if ( r . isCompatibleWith ( p ) ) {
compatibleMediaTypes . add ( getMostSpecificMediaType ( r , p ) ) ;
for ( MediaType requestedType : requestedMediaTypes ) {
for ( MediaType producibleType : producibleMediaTypes ) {
if ( requestedType . isCompatibleWith ( producibleType ) ) {
compatibleMediaTypes . add ( getMostSpecificMediaType ( requestedType , producibleType ) ) ;
}
}
}
@ -143,7 +138,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -143,7 +138,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
if ( selectedMediaType ! = null ) {
selectedMediaType = selectedMediaType . removeQualityValue ( ) ;
for ( HttpMessageConverter < ? > messageConverter : messageConverters ) {
for ( HttpMessageConverter < ? > messageConverter : this . messageConverters ) {
if ( messageConverter . canWrite ( returnValueClass , selectedMediaType ) ) {
( ( HttpMessageConverter < T > ) messageConverter ) . write ( returnValue , selectedMediaType , outputMessage ) ;
if ( logger . isDebugEnabled ( ) ) {
@ -154,15 +149,15 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -154,15 +149,15 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
}
}
}
throw new HttpMediaTypeNotAcceptableException ( allSupportedMediaTypes ) ;
throw new HttpMediaTypeNotAcceptableException ( this . allSupportedMediaTypes ) ;
}
/ * *
* Returns the media types that can be produced :
* < ul >
* < li > The producible media types specified in the request mappings , or
* < li > Media types of configured converters that can write the specific return value , or
* < li > { @link MediaType # ALL }
* < li > The producible media types specified in the request mappings , or
* < li > Media types of configured converters that can write the specific return value , or
* < li > { @link MediaType # ALL }
* < / ul >
* /
@SuppressWarnings ( "unchecked" )
@ -171,9 +166,9 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -171,9 +166,9 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
if ( ! CollectionUtils . isEmpty ( mediaTypes ) ) {
return new ArrayList < MediaType > ( mediaTypes ) ;
}
else if ( ! allSupportedMediaTypes . isEmpty ( ) ) {
else if ( ! this . allSupportedMediaTypes . isEmpty ( ) ) {
List < MediaType > result = new ArrayList < MediaType > ( ) ;
for ( HttpMessageConverter < ? > converter : messageConverters ) {
for ( HttpMessageConverter < ? > converter : this . messageConverters ) {
if ( converter . canWrite ( returnValueClass , null ) ) {
result . addAll ( converter . getSupportedMediaTypes ( ) ) ;
}
@ -187,7 +182,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -187,7 +182,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
private List < MediaType > getAcceptableMediaTypes ( HttpServletRequest request ) throws HttpMediaTypeNotAcceptableException {
List < MediaType > mediaTypes = this . contentNegotiationManager . resolveMediaTypes ( new ServletWebRequest ( request ) ) ;
return mediaTypes . isEmpty ( ) ? Collections . singletonList ( MediaType . ALL ) : mediaTypes ;
return ( mediaTypes . isEmpty ( ) ? Collections . singletonList ( MediaType . ALL ) : mediaTypes ) ;
}
/ * *
@ -195,8 +190,8 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -195,8 +190,8 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
* with the q - value of the former .
* /
private MediaType getMostSpecificMediaType ( MediaType acceptType , MediaType produceType ) {
produceType = produceType . copyQualityValue ( acceptType ) ;
return MediaType . SPECIFICITY_COMPARATOR . compare ( acceptType , produceType ) < = 0 ? acceptType : produceType ;
MediaType produceTypeToUs e = produceType . copyQualityValue ( acceptType ) ;
return ( MediaType . SPECIFICITY_COMPARATOR . compare ( acceptType , produceTypeToUs e ) < = 0 ? acceptType : produceTypeToUse ) ;
}
}