/** 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.
* You may obtain a copy of the License at
*
*http://www.apache.org/licenses/LICENSE-2.0*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.*/
packageorg.springframework.http.converter;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.nio.charset.Charset;importjava.util.ArrayList;importjava.util.List;importorg.springframework.http.HttpInputMessage;importorg.springframework.http.HttpOutputMessage;importorg.springframework.http.MediaType;importorg.springframework.util.StreamUtils;/*** Implementation of {@linkHttpMessageConverter} that can read and write strings.
*
*
By default, this converter supports all media types ({@code*/*}),
* and writes with a {@codeContent-Type} of {@codetext/plain}. This can be overridden
* by setting the {@link#setSupportedMediaTypes supportedMediaTypes} property.
*
*@authorArjen Poutsma
*@since3.0*/
public class StringHttpMessageConverter extends AbstractHttpMessageConverter{public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");private finalCharset defaultCharset;private final ListavailableCharsets;private boolean writeAcceptCharset = true;/*** A default constructor that uses {@code"ISO-8859-1"} as the default charset.
*@see#StringHttpMessageConverter(Charset)*/
publicStringHttpMessageConverter() {this(DEFAULT_CHARSET);
}/*** A constructor accepting a default charset to use if the requested content
* type does not specify one.*/
publicStringHttpMessageConverter(Charset defaultCharset) {super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);this.defaultCharset =defaultCharset;this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
}/*** Indicates whether the {@codeAccept-Charset} should be written to any outgoing request.
*
Default is {@codetrue}.*/
public void setWriteAcceptCharset(booleanwriteAcceptCharset) {this.writeAcceptCharset =writeAcceptCharset;
}
@Overridepublic boolean supports(Class>clazz) {return String.class ==clazz;
}
@Overrideprotected String readInternal(Class extends String> clazz, HttpInputMessage inputMessage) throwsIOException {
Charset charset=getContentTypeCharset(inputMessage.getHeaders().getContentType());returnStreamUtils.copyToString(inputMessage.getBody(), charset);
}
@OverrideprotectedLong getContentLength(String str, MediaType contentType) {
Charset charset=getContentTypeCharset(contentType);try{return (long) str.getBytes(charset.name()).length;
}catch(UnsupportedEncodingException ex) {//should not occur
throw newIllegalStateException(ex);
}
}
@Overrideprotected void writeInternal(String str, HttpOutputMessage outputMessage) throwsIOException {if (this.writeAcceptCharset) {
outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}
Charset charset=getContentTypeCharset(outputMessage.getHeaders().getContentType());
StreamUtils.copy(str, charset, outputMessage.getBody());
}/*** Return the list of supported {@linkCharset}s.
*
By default, returns {@linkCharset#availableCharsets()}.
* Can be overridden in subclasses.
*@returnthe list of accepted charsets*/
protected ListgetAcceptedCharsets() {return this.availableCharsets;
}privateCharset getContentTypeCharset(MediaType contentType) {if (contentType != null && contentType.getCharSet() != null) {returncontentType.getCharSet();
}else{return this.defaultCharset;
}
}
}