/*
* @(#)FormatHandlerMethodReturnValueHandler.java 2013-1-31 下午23:33:33
*
* Copyright (c) 2011-2013 Makersoft.org all rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
*/
package org.makersoft.web.mvc.method.annotation;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.makersoft.web.mvc.annotation.Format;
import org.makersoft.web.mvc.json.JSONResult;
import org.makersoft.web.mvc.json.JSONWriter;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* 自定义结果集转换Handler.
*
* @see Format
*
* @version 2013-1-31 下午5:59:39
* @author Feng Kuok
*/
public class FormatHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler{
private String encoding = "UTF-8";
private boolean wrapWithComments = false;
private boolean prefix = false;
private boolean enableGZIP = false;
// /*
// * whether to ignore properties defined on base classes of the root object
// */
// private boolean ignoreHierarchy = true;
private boolean enumAsBean = JSONWriter.ENUM_AS_BEAN_DEFAULT;
private boolean noCache = false;
private boolean excludeNullProperties = false;
private String callbackParameter;
private String wrapPrefix;
private String wrapSuffix;
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return returnType.getMethodAnnotation(Format.class) != null;
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
mavContainer.setRequestHandled(true);
if (returnValue != null) {
writeWithJSONSerialize(returnValue, returnType, webRequest);
}
}
protected <T extends Object> void writeWithJSONSerialize(T returnValue, MethodParameter returnType, NativeWebRequest webRequest) throws IOException ,HttpMediaTypeNotAcceptableException {
ServletServerHttpRequest inputMessage = this.createInputMessage(webRequest);
ServletServerHttpResponse outputMessage = this.createOutputMessage(webRequest);
Format format = returnType.getMethodAnnotation(Format.class);
JSONResult result = new JSONResult();
if(format.excludes().length > 0){
result.setExcludeProperties(StringUtils.join(format.excludes(), ","));
}
if(format.includes().length > 0){
result.setIncludeProperties(StringUtils.join(format.includes(), ","));
}
// default false
result.setIgnoreHierarchy(format.ignoreHierarchy());
//settings
result.setEncoding(encoding);
result.setWrapWithComments(wrapWithComments);
result.setPrefix(prefix);
result.setEnableGZIP(enableGZIP);
result.setEnumAsBean(enumAsBean);
result.setNoCache(noCache);
result.setExcludeNullProperties(excludeNullProperties);
result.setCallbackParameter(callbackParameter);
result.setWrapPrefix(wrapPrefix);
result.setWrapSuffix(wrapSuffix);
try {
result.execute(inputMessage.getServletRequest(), outputMessage.getServletResponse(), returnValue);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected ServletServerHttpResponse createOutputMessage(NativeWebRequest webRequest) {
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
return new ServletServerHttpResponse(response);
}
/**
* Creates a new {@link HttpInputMessage} from the given {@link NativeWebRequest}.
*
* @param webRequest the web request to create an input message from
* @return the input message
*/
protected ServletServerHttpRequest createInputMessage(NativeWebRequest webRequest) {
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
return new ServletServerHttpRequest(servletRequest);
}
//setter methods
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setWrapWithComments(boolean wrapWithComments) {
this.wrapWithComments = wrapWithComments;
}
public void setPrefix(boolean prefix) {
this.prefix = prefix;
}
public void setEnableGZIP(boolean enableGZIP) {
this.enableGZIP = enableGZIP;
}
// public void setIgnoreHierarchy(boolean ignoreHierarchy) {
// this.ignoreHierarchy = ignoreHierarchy;
// }
public void setEnumAsBean(boolean enumAsBean) {
this.enumAsBean = enumAsBean;
}
public void setNoCache(boolean noCache) {
this.noCache = noCache;
}
public void setExcludeNullProperties(boolean excludeNullProperties) {
this.excludeNullProperties = excludeNullProperties;
}
public void setCallbackParameter(String callbackParameter) {
this.callbackParameter = callbackParameter;
}
public void setWrapPrefix(String wrapPrefix) {
this.wrapPrefix = wrapPrefix;
}
public void setWrapSuffix(String wrapSuffix) {
this.wrapSuffix = wrapSuffix;
}
}