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.ctx.api.HttpMethod;
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.RouteMeta;
import org.webpieces.router.impl.RoutingHolder;
@Singleton
public class MenuCreator {
private Menu menu;
private RoutingHolder routes;
private Set descriptors;
@Inject
public MenuCreator(RoutingHolder routes, Set descriptors) {
this.routes = routes;
this.descriptors = descriptors;
}
private SingleMenu convert(Entry> entry) {
return new SingleMenu(entry.getKey(), entry.getValue());
}
private void wireInSecurePages(ReverseRouteLookup reverseRouteLookup, Map> secureMenuMap, BackendGuiDescriptor desc) {
for(PageDescriptor pageDesc : desc.getWireIntoGuiDescriptors()) {
if(!pageDesc.isSecure())
continue;
List descriptors = secureMenuMap.getOrDefault(pageDesc.getMenuCategory(), new ArrayList<>());
RouteMeta meta = reverseRouteLookup.get(pageDesc.getRouteId());
if(meta.getRoute().getHttpMethod() != HttpMethod.GET)
throw new RuntimeException("Plugin "+desc.getPluginName()+" supplied an illegal route id that is not a GET request="+pageDesc.getRouteId());
String url = meta.getRoute().getFullPath();
descriptors.add(new SingleMenuItem(pageDesc.getMenuTitle(), url));
secureMenuMap.putIfAbsent(pageDesc.getMenuCategory(), descriptors);
}
}
private void wireInPublicPages(ReverseRouteLookup reverseRouteLookup, Map> publicMenuMap, BackendGuiDescriptor desc) {
for(PageDescriptor pageDesc : desc.getWireIntoGuiDescriptors()) {
if(pageDesc.isSecure())
continue;
List descriptors = publicMenuMap.getOrDefault(pageDesc.getMenuCategory(), new ArrayList<>());
RouteMeta meta = reverseRouteLookup.get(pageDesc.getRouteId());
if(meta.getRoute().getHttpMethod() != HttpMethod.GET)
throw new RuntimeException("Plugin "+desc.getPluginName()+" supplied an illegal route id that is not a GET request="+pageDesc.getRouteId());
String url = meta.getRoute().getFullPath();
descriptors.add(new SingleMenuItem(pageDesc.getMenuTitle(), url));
publicMenuMap.putIfAbsent(pageDesc.getMenuCategory(), descriptors);
}
}
public synchronized Menu getMenu() {
if(menu == null)
createMenuOnce();
return menu;
}
private void createMenuOnce() {
Map> secureMenuMap = new HashMap<>();
Map> publicMenuMap = new HashMap<>();
for(BackendGuiDescriptor desc : descriptors) {
wireInSecurePages(routes.getReverseRouteLookup(), secureMenuMap, desc);
wireInPublicPages(routes.getReverseRouteLookup(), publicMenuMap, desc);
}
menu = new Menu(create(secureMenuMap), create(publicMenuMap));
}
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