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

org.webpieces.plugins.backend.menu.MenuCreator Maven / Gradle / Ivy

package org.webpieces.plugins.backend.menu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.inject.Inject;
import javax.inject.Singleton;

import org.webpieces.plugins.backend.spi.BackendGuiDescriptor;
import org.webpieces.plugins.backend.spi.MenuCategory;
import org.webpieces.plugins.backend.spi.PageDescriptor;
import org.webpieces.router.api.routing.ReverseRouteLookup;
import org.webpieces.router.impl.RoutingHolder;

@Singleton
public class MenuCreator {

	private List menus;
	private RoutingHolder routes;
	private Set descriptors;

	@Inject
	public MenuCreator(RoutingHolder routes, Set descriptors) {
		this.routes = routes;
		this.descriptors = descriptors;
	}
	
	private SingleMenu convert(Entry> entry) {
		boolean allSecure = true;
		for(SingleMenuItem item : entry.getValue()) {
			if(!item.isSecure())
				allSecure = false;
		}
		
		return new SingleMenu(entry.getKey(), entry.getValue(), allSecure);
	}
	
	private void wireInPages(ReverseRouteLookup reverseRouteLookup, Map> secureMenuMap, BackendGuiDescriptor desc) {
		for(PageDescriptor pageDesc : desc.getWireIntoGuiDescriptors()) {
			List descriptors = secureMenuMap.getOrDefault(pageDesc.getMenuCategory(), new ArrayList<>());

			if(!reverseRouteLookup.isGetRequest(pageDesc.getRouteId()))
				throw new RuntimeException("Plugin "+desc.getPluginName()+" supplied an illegal route id that is not a GET request="+pageDesc.getRouteId());
			
			String url = reverseRouteLookup.convertToUrl(pageDesc.getRouteId());
			
			descriptors.add(new SingleMenuItem(pageDesc.getMenuTitle(), url, pageDesc.isSecure()));
			secureMenuMap.putIfAbsent(pageDesc.getMenuCategory(), descriptors);
		}
	}
	
	public synchronized List getMenu() {
		if(menus == null)
			createMenuOnce();
		
		return menus;
	}

	private void createMenuOnce() {
		Map> menuMap = new HashMap<>();

		for(BackendGuiDescriptor desc : descriptors) {
			wireInPages(routes.getReverseRouteLookup(), menuMap, desc);
		}
		
		menus = create(menuMap);
	}

	private List create(Map> secureMenuMap) {
		List menu = new ArrayList<>();

		for(Map.Entry> entry : secureMenuMap.entrySet()) {
			menu.add(convert(entry));
		}
		return menu;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy