All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cloud.agileframework.mvc.util.ViewUtil Maven / Gradle / Ivy

package cloud.agileframework.mvc.util;

import cloud.agileframework.common.constant.Constant;
import cloud.agileframework.common.util.file.ResponseFile;
import cloud.agileframework.mvc.base.AbstractResponseFormat;
import cloud.agileframework.mvc.base.RETURN;
import cloud.agileframework.spring.util.BeanUtil;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.RequestToViewNameTranslator;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

/**
 * @author 佟盟 on 2018/8/22
 * @author 佟盟
 */
@Component
public class ViewUtil {
    private static ViewUtil viewUtil;
    @Nullable
    private List viewResolvers;
    @Nullable
    private Locale locale;
    @Nullable
    private RequestToViewNameTranslator viewNameTranslator;


    public static void render(RETURN head, Object result, HttpServletRequest request, HttpServletResponse response) throws Exception {
        render(getResponseFormatData(head, result), request, response);
    }

    /**
     * 格式化响应报文
     *
     * @param head   头信息
     * @param result 体信息
     * @return 格式化后的ModelAndView
     */
    public static ModelAndView getResponseFormatData(RETURN head, Object result) {
        ModelAndView modelAndView = new ModelAndView();
        AbstractResponseFormat abstractResponseFormat = BeanUtil.getBean(AbstractResponseFormat.class);
        if (abstractResponseFormat != null) {
            modelAndView = abstractResponseFormat.buildResponse(head, result);
        } else {
            if (head != null) {
                modelAndView.addObject(Constant.ResponseAbout.HEAD, head);
            }
            if (result != null && Map.class.isAssignableFrom(result.getClass())) {
                modelAndView.addAllObjects((Map) result);
            } else {
                modelAndView.addObject(Constant.ResponseAbout.RESULT, result);
            }
        }
        return modelAndView;
    }

    public static void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request, response));

        ApplicationContext context = BeanUtil.getApplicationContext();

        if (viewUtil.locale == null) {
            initLocaleResolver(context, request);
        }
        if (viewUtil.viewResolvers == null) {
            initViewResolvers(context);
        }
        if (viewUtil.viewNameTranslator == null) {
            initRequestToViewNameTranslator(context);
        }

        response.setLocale(viewUtil.locale);
        String viewName = mv.getViewName();
        if (viewName == null) {
            viewName = getDefaultViewName(request);
            mv.setViewName(viewName);
        }
        View view = resolveViewName(viewName, mv.getModel(), viewUtil.locale, request);

        if (mv.getStatus() != null) {
            response.setStatus(mv.getStatus().value());
        }

        view.render(mv.getModel(), request, response);
    }

    @Nullable
    private static View resolveViewName(String viewName, @Nullable Map model, Locale locale, HttpServletRequest request) throws Exception {

        if (viewUtil.viewResolvers != null) {
            Iterator var5 = viewUtil.viewResolvers.iterator();

            while (var5.hasNext()) {
                ViewResolver viewResolver = (ViewResolver) var5.next();
                View view = viewResolver.resolveViewName(viewName, locale);
                if (view != null) {
                    return view;
                }
            }
        }

        return null;
    }

    private static void initLocaleResolver(ApplicationContext context, HttpServletRequest request) throws IOException {
        List localeResolvers = getDefaultStrategies(context, LocaleResolver.class);
        viewUtil.locale = localeResolvers.size() > 0 ? (localeResolvers.get(0)).resolveLocale(request) : request.getLocale();
    }

    private static void initViewResolvers(ApplicationContext context) throws IOException {
        viewUtil.viewResolvers = null;
        Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
        if (!matchingBeans.isEmpty()) {
            viewUtil.viewResolvers = new LinkedList<>(matchingBeans.values());
            AnnotationAwareOrderComparator.sort(viewUtil.viewResolvers);
        }

        if (viewUtil.viewResolvers == null) {
            viewUtil.viewResolvers = getDefaultStrategies(context, ViewResolver.class);
        }
    }

    private static void initRequestToViewNameTranslator(ApplicationContext context) throws IOException {
        try {
            viewUtil.viewNameTranslator = context.getBean("viewNameTranslator", RequestToViewNameTranslator.class);
        } catch (NoSuchBeanDefinitionException var3) {
            viewUtil.viewNameTranslator = getDefaultStrategies(context, RequestToViewNameTranslator.class).get(0);
        }

    }

    private static  List getDefaultStrategies(ApplicationContext context, Class strategyInterface) throws IOException {
        String key = strategyInterface.getName();
        ClassPathResource resource = new ClassPathResource("DispatcherServlet.properties", DispatcherServlet.class);
        Properties defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
        String value = defaultStrategies.getProperty(key);
        if (value == null) {
            return new LinkedList<>();
        } else {

            String[] classNames = StringUtils.commaDelimitedListToStringArray(value);
            List strategies = new ArrayList<>(classNames.length);
            int var8 = classNames.length;

            for (int var9 = 0; var9 < var8; ++var9) {
                String className = classNames[var9];

                try {
                    Class clazz = ClassUtils.forName(className, DispatcherServlet.class.getClassLoader());
                    Object strategy = context.getAutowireCapableBeanFactory().createBean(clazz);
                    strategies.add((T) strategy);
                } catch (ClassNotFoundException var13) {
                    throw new BeanInitializationException("Could not find DispatcherServlet's default strategy class [" + className + "] for interface [" + key + "]", var13);
                } catch (LinkageError var14) {
                    throw new BeanInitializationException("Unresolvable class definition for DispatcherServlet's default strategy class [" + className + "] for interface [" + key + "]", var14);
                }
            }

            return strategies;

        }
    }

    @Nullable
    private static String getDefaultViewName(HttpServletRequest request) throws Exception {
        return viewUtil.viewNameTranslator != null ? viewUtil.viewNameTranslator.getViewName(request) : null;
    }

    /**
     * 提取model对象中的文件数据
     *
     * @param model 容器
     * @return 容器中包含的所有文件
     */
    @SuppressWarnings("unchecked")
    public static List extractResponseFiles(Object model) {
        List result = new ArrayList<>();

        if (model == null) {
            return result;
        } else if (ResponseFile.class.isAssignableFrom(model.getClass())) {
            result.add((ResponseFile) model);
        } else if (Map.class.isAssignableFrom(model.getClass())) {
            ((Map) model).values().forEach(v -> result.addAll(extractResponseFiles(v)));
        } else if (Collection.class.isAssignableFrom(model.getClass())) {
            ((Collection) model).forEach(v -> result.addAll(extractResponseFiles(v)));
        }

        return result;
    }

    /**
     * 提取model对象中的文件数据
     *
     * @param model 容器
     * @return 容器中包含的所有文件
     */
    @SuppressWarnings("unchecked")
    public static List extractFiles(Object model) {
        List result = new ArrayList<>();

        if (model == null) {
            return result;
        } else if (File.class.isAssignableFrom(model.getClass())) {
            result.add((File) model);
        } else if (Map.class.isAssignableFrom(model.getClass())) {
            ((Map) model).values().forEach(v -> result.addAll(extractFiles(v)));
        } else if (Collection.class.isAssignableFrom(model.getClass())) {
            ((Collection) model).forEach(v -> result.addAll(extractFiles(v)));
        }

        return result;
    }

    @PostConstruct
    public static void init() {
        viewUtil = new ViewUtil();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy