WebjetViewResolver.java

package sk.iway.iwcm.system.spring.webjet_component;

import org.springframework.core.Ordered;
import org.springframework.lang.NonNull;
import org.springframework.web.context.support.WebApplicationObjectSupport;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.RedirectView;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.FileTools;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;

import java.util.*;

// vracia vhodny view z viewResolverov na zaklade cesty
public class WebjetViewResolver extends WebApplicationObjectSupport implements ViewResolver {

    private String viewFolder;
    private List<ViewResolver> viewResolvers;

    public View resolveViewName(@NonNull String viewName, @NonNull Locale locale) throws Exception {
        if (viewResolvers == null) {
            return null;
        }

        if (viewName.startsWith("redirect:")) {
            return new RedirectView(Tools.replace(viewName, "redirect:", ""));
        }

        for (ViewResolver viewResolver : viewResolvers) {

            String viewNameLocal = viewName;

            if (!WebjetInternalResourceViewResolver.class.isAssignableFrom(viewResolver.getClass())
                    && !WebjetFreeMarkerViewResolver.class.isAssignableFrom(viewResolver.getClass())) {
                View view = viewResolver.resolveViewName(viewNameLocal, locale);
                if (view != null) {
                    return view;
                }

                continue;
            }

            String prefix;
            String suffix;

            if (viewResolver instanceof WebjetInternalResourceViewResolver) {
                WebjetInternalResourceViewResolver wjViewResolver = (WebjetInternalResourceViewResolver) viewResolver;
                prefix = wjViewResolver.getPrefix();
                suffix = wjViewResolver.getSuffix();
            }
            else {
                WebjetFreeMarkerViewResolver wjViewResolver = (WebjetFreeMarkerViewResolver) viewResolver;
                prefix = wjViewResolver.getPrefix();
                suffix = wjViewResolver.getSuffix();
            }

            if (Tools.isNotEmpty(prefix)) {
                viewNameLocal = prefix + viewNameLocal;
            }

            if (Tools.isNotEmpty(suffix) && !viewNameLocal.contains(suffix)) {
                viewNameLocal = viewNameLocal + suffix;
                // kedze pridavam suffix do viewName, tak uz nie je potrebny vo viewResolveri, kedze ten je sprosty a vlozi suffix do viewName znova
                //wjViewResolver.setSuffix("");
            }

            // cesta s installName
            List<String> paths = getPaths(viewNameLocal);
            for (String path : paths) {
                if (FileTools.isFile(path)) {
                    return viewResolver.resolveViewName(Tools.replace(path, suffix, ""), locale);
                }
            }
        }

        Logger.debug(WebjetViewResolver.class, String.format("JSP not found: %s", viewName));
        //throw new Exception(String.format("JSP not found: %s", viewName));

        return null;
    }

    public void setViewResolvers(List<ViewResolver> viewResolvers)
    {
        this.viewResolvers = viewResolvers;
        this.viewResolvers.sort(Comparator.comparing(o -> ((Ordered) o).getOrder()));
    }

    private List<String> getPaths(String viewName) {
        String installName = Constants.getInstallName();
        List<String> result = new ArrayList<>();

        List<String> tokens1 = new ArrayList<>(Arrays.asList(Tools.getTokens(viewName, "/")));
        if (Tools.isNotEmpty(viewFolder)) {
            tokens1.add(tokens1.size() - 1, viewFolder);
        }

        List<String> tokens2 = new ArrayList<>(Arrays.asList(Tools.getTokens(viewName, "/")));
        tokens2.add(1, installName);
        if (Tools.isNotEmpty(viewFolder)) {
            tokens2.add(tokens2.size() - 1, viewFolder);
        }

        result.add("/" + Tools.join(tokens2, "/"));
        result.add("/" + Tools.join(tokens1, "/"));

        return result;
    }

    public String getViewFolder() {
        return viewFolder;
    }

    public void setViewFolder(String viewFolder) {
        this.viewFolder = viewFolder;
    }
}