GalleryListener.java

package sk.iway.iwcm.components.gallery;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.JsonTools;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.admin.ThymeleafEvent;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.system.multidomain.MultiDomainFilter;
import sk.iway.iwcm.system.spring.events.WebjetEvent;

@Component
public class GalleryListener {

    private final GalleryTreeService galleryTreeService;

    public GalleryListener(GalleryTreeService galleryTreeService) {
        this.galleryTreeService = galleryTreeService;
    }

    @EventListener(condition = "#event.clazz eq 'sk.iway.iwcm.admin.ThymeleafEvent' && event.source.page=='gallery' && event.source.subpage=='index'")
    private void setData(final WebjetEvent<ThymeleafEvent> event) {
        try {
            ModelMap model = event.getSource().getModel();

            //set baseDir to open in jstree
            String baseDir = Constants.getString("imagesRootDir") + "/" + Constants.getString("galleryDirName");
            if (Constants.getString("imagesRootDir").length() > 1) {
                if (Constants.getBoolean("multiDomainEnabled")) {
                    String domainAlias = MultiDomainFilter.getDomainAlias(DocDB.getDomain(event.getSource().getRequest()));
                    if (Tools.isNotEmpty(domainAlias)) {
                        baseDir = Constants.getString("imagesRootDir") + "/" + domainAlias + "/" + Constants.getString("galleryDirName");
                    }
                }
            }

            model.addAttribute("baseDir", baseDir);

            String dir = event.getSource().getRequest().getParameter("dir");
            if (Tools.isEmpty(dir)) dir = baseDir;

            model.addAttribute("treeInitialJson", JsonTools.objectToJSON(getTreeInitialJson(dir)));
        } catch (Exception ex) {
            Logger.error(getClass(), ex);
        }
    }

    /**
     * Recursivelly fill List for tree render
     * @param url
     * @return
     */
    private List<GalleryJsTreeItem> getTreeInitialJson(String url) {
        List<GalleryJsTreeItem> treeInitialJson = new ArrayList<>();
        String[] pathArr = Tools.getTokens(url, "/", true);
        final StringBuilder currentPath = new StringBuilder();
        boolean isRoot = true;
        for (String path : pathArr) {
            currentPath.append("/").append(path);
            List<GalleryJsTreeItem> items = galleryTreeService.getItems(currentPath.toString());
            if (isRoot) {
                items.stream().forEach((item) -> {
                    //root item
                    item.setParent("#");
                });
                isRoot = false;
            } else {
                items.stream().forEach((item) -> {
                    item.setParent(currentPath.toString());
                });
            }
            treeInitialJson.addAll(items);
        }
        //set opened and selected state
        treeInitialJson.stream().forEach((item) -> {
            if (url.startsWith(item.getId())) item.getState().setOpened(true);
            if (url.equals(item.getId())) item.getState().setSelected(true);
        });
        return treeInitialJson;
    }

}