/**
* Copyright 2013-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.
*/
package com.iflytek.edu.cloud.frame.spring;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.util.ClassUtils;
import org.springframework.util.StreamUtils;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
import com.iflytek.edu.cloud.frame.Constants;
/**
*
* @author libinsong1204@gmail.com
*
*/
public class RequestResponseBodyMethodProcessorExt extends RequestResponseBodyMethodProcessor {
private final static MediaType MEDIA_TYPE_XML = MediaType.valueOf("application/xml;charset=UTF-8");
private final static MediaType MEDIA_TYPE_JSON = MediaType.valueOf("application/json;charset=UTF-8");
public RequestResponseBodyMethodProcessorExt(
List<HttpMessageConverter<?>> messageConverters) {
super(messageConverters);
}
@Override
protected <T> void writeWithMessageConverters(T returnValue, MethodParameter returnType,
ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)
throws IOException, HttpMediaTypeNotAcceptableException {
Class<?> returnValueClass = returnValue.getClass();
HttpServletRequest servletRequest = inputMessage.getServletRequest();
String format = servletRequest.getParameter(Constants.SYS_PARAM_KEY_FORMAT);
MediaType contentType = MEDIA_TYPE_XML;
if(Constants.DATA_FORMAT_JSON.equals(format))
contentType = MEDIA_TYPE_JSON;;
if(ClassUtils.isPrimitiveOrWrapper(returnValueClass)) {
if(Constants.DATA_FORMAT_JSON.equals(format)) {
String result = "{\"return\":\"" + returnValue + "\"}";
write(result, contentType, outputMessage);
} else {
String result = "<return>" + returnValue + "</return>";
write(result, contentType, outputMessage);
}
} else {
for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
if (messageConverter.canWrite(returnValueClass, contentType)) {
((HttpMessageConverter<T>) messageConverter).write(returnValue, contentType, outputMessage);
if (logger.isDebugEnabled()) {
logger.debug("Written [" + returnValue + "] as \"" + contentType + "\" using [" +
messageConverter + "]");
}
return;
}
}
}
}
private Charset charset = Charset.forName("UTF-8");
private void write(final String content, MediaType contentType, ServletServerHttpResponse outputMessage)
throws IOException, HttpMessageNotWritableException {
final HttpHeaders headers = outputMessage.getHeaders();
headers.setContentType(contentType);
if (headers.getContentLength() == -1) {
Long contentLength = getContentLength(content, headers.getContentType());
if (contentLength != null) {
headers.setContentLength(contentLength);
}
}
StreamUtils.copy(content, charset, outputMessage.getBody());
outputMessage.getBody().flush();
}
private Long getContentLength(String s, MediaType contentType) {
try {
return (long) s.getBytes(charset.name()).length;
}
catch (UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
}
}