StringHttpMessageConverter.java 3.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright 2002-2009 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.
 */

17
package org.springframework.http.converter;
18 19 20 21 22 23 24 25 26

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

27 28 29
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
30
import org.springframework.util.FileCopyUtils;
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

/**
 * Implementation of {@link HttpMessageConverter} that can read and write strings.
 *
 * <p>By default, this converter supports all text media types (<code>text&#47;&#42;</code>), and writes with a {@code
 * Content-Type} of {@code text/plain}. This can be overridden by setting the {@link
 * #setSupportedMediaTypes(java.util.List) supportedMediaTypes} property.
 *
 * @author Arjen Poutsma
 * @since 3.0
 */
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

	public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

	private final List<Charset> availableCharsets;

	public StringHttpMessageConverter() {
		super(new MediaType("text", "plain", DEFAULT_CHARSET), new MediaType("text", "*"));
50
		this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
51 52 53 54 55 56
	}

	public boolean supports(Class<? extends String> clazz) {
		return String.class.equals(clazz);
	}

57 58
	@Override
	public String readInternal(Class<String> clazz, HttpInputMessage inputMessage) throws IOException {
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
		MediaType contentType = inputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;
		return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));
	}

	@Override
	protected Long getContentLength(String s) {
		Charset charset = getContentType(s).getCharSet();
		if (charset != null) {
			try {
				return (long) s.getBytes(charset.name()).length;
			}
			catch (UnsupportedEncodingException ex) {
				// should not occur
				throw new InternalError(ex.getMessage());
			}
		}
		else {
			return null;
		}
	}

	@Override
82
	protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {
83 84 85 86 87 88 89
		outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
		MediaType contentType = getContentType(s);
		Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;
		FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset));
	}

	/**
90 91
	 * Return the list of supported {@link Charset}. <p>By default, returns {@link Charset#availableCharsets()}. Can be
	 * overridden in subclasses.
92
	 *
93 94 95
	 * @return the list of accepted charsets
	 */
	protected List<Charset> getAcceptedCharsets() {
96
		return this.availableCharsets;
97 98 99
	}

}