package com.asual.summer.core.spring;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.SmartView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.AbstractView;
import com.asual.summer.core.ResponseViews;
import com.asual.summer.core.util.BeanUtils;
import com.asual.summer.core.view.AbstractResponseView;
public class AnnotationHandlerMethodReturnValueHandler implements
HandlerMethodReturnValueHandler {
@Autowired
private ViewResolverConfiguration viewResolverConfiguration;
@Override
public boolean supportsReturnType(MethodParameter returnType) {
Class<?> paramType = returnType.getParameterType();
return ModelAndView.class.isAssignableFrom(paramType) || void.class.equals(paramType) || ModelMap.class.isAssignableFrom(paramType) || View.class.isAssignableFrom(paramType);
}
@Override
public void handleReturnValue(Object returnValue,
MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
/*
* if(mav.isReference()) { String viewName = mav.getViewName();
* mavContainer.setViewName(viewName); if (viewName != null &&
* viewName.startsWith("redirect:")) {
* mavContainer.setRedirectModelScenario(true); } }
*/
View view = null;
if (returnValue != null) {
if (returnValue instanceof ModelAndView) {
ModelAndView mav = (ModelAndView) returnValue;
mavContainer.addAllAttributes(mav.getModelMap());
view = mav.getView();
if(view == null){
mavContainer.setViewName(mav.getViewName());
}
} else if (returnValue instanceof ModelMap) {
mavContainer.addAllAttributes((ModelMap) returnValue);
} else if (returnValue instanceof View){
view = (View) returnValue;
}
}
// summer logic
if(view != null){
mavContainer.setView(view);
ResponseViews viewAnn = AnnotationUtils.findAnnotation(
returnType.getMethod(), ResponseViews.class);
if (view instanceof SmartView) {
if (((SmartView) view).isRedirectView()) {
mavContainer.setRedirectModelScenario(true);
}
}
else if (viewAnn != null){
Class<? extends AbstractResponseView>[] values = viewAnn.value();
List<AbstractView> views = new ArrayList<AbstractView>();
boolean explicit = viewAnn.explicit();
if (values.length != 0) {
for (Class<? extends AbstractResponseView> value : values) {
views.addAll(BeanUtils.getBeansOfType(value).values());
}
}
view = (AbstractResponseView) viewResolverConfiguration.handleViews(views, webRequest);
if (explicit) {
view = views.get(0);
}
}
}
else{
ResponseViews viewAnn = AnnotationUtils.findAnnotation(
returnType.getMethod(), ResponseViews.class);
if (viewAnn != null){
Class<? extends AbstractResponseView>[] values = viewAnn.value();
List<AbstractView> views = new ArrayList<AbstractView>();
boolean explicit = viewAnn.explicit();
if (values.length != 0) {
for (Class<? extends AbstractResponseView> value : values) {
views.addAll(BeanUtils.getBeansOfType(value).values());
}
}
view = (AbstractResponseView) viewResolverConfiguration.handleViews(views, webRequest);
if (explicit) {
view = views.get(0);
}
if(view != null){
mavContainer.setView(view);
}
}
}
}
}